2012-12-16 7 views

Antwort

37

Wenn du hast GNU mv (und find und xargs), können Sie die -t Option mv verwenden können (und -print0 für find und -0 für xargs):

find . -type d -mtime -0 -print0 | xargs -0 mv -t /path/to/target-dir 

Beachten Sie, dass moderne Versionen von find (kompatibel mit POSIX 2008) unterstützen + anstelle von ; und verhalten sich ungefähr gleich wie xargs ohne xargs mit:

find . -type d -mtime -0 -exec mv -t /path/to/target-dir {} + 

Dies macht find Gruppe bequem Zahlen Datei (Verzeichnis) Namen in einen einzigen Aufruf des Programms. Sie haben nicht die Kontrolle über die Anzahl der Argumente, die an mv übergeben werden, die xargs bietet, aber Sie brauchen das eigentlich selten sowieso. Dies hängt immer noch von der -t Option zu GNU mv ab.

+0

Dies funktioniert nicht (Sie haben die 'mv' Argumente umgekehrt) – jlliagre

+0

@jlliagre: Haben Sie die Bedeutung der' -t' Option nachgeschlagen? Es folgt der Name des Zielverzeichnisses und bedeutet, dass das letzte Argument nicht das Ziel ist, was genau diese Verwendung mit 'xargs' ermöglicht. –

+1

Entschuldigung, Sie haben Recht. Ich habe "-t" falsch gelesen, um stattdessen ein 'xarg'-Argument zu sein. – jlliagre

0

Wenn Sie nicht GNU mv verwenden, können Sie diesen Befehl verwenden:

find . -depth -type d -mtime 0 -exec bash -c 'declare -a array;j=1;for i; do array[$j]="$i"; j=$((j+1));done; mv "${array[*]}" /path/to/target-dir' arg0 {} + 

anders, hier ist eine einfachere Lösung, die nicht xargs erfordert:

find . -depth -type d -mtime 0 -exec mv -t /path/to/target-dir {} + 

Bitte beachte, dass ich hinzugefügt -depth sonst haben Sie Fehler, wenn sowohl ein Verzeichnis als auch eines seiner Unterverzeichnisse verarbeitet werden sollen.

1

find ist nicht wirklich ein gutes Werkzeug dafür. Ich stelle mir vor, Sie möchten alle Unterverzeichnisse in ein anderes Verzeichnis verschieben. find ausgeben wird Dinge wie

./a 
./a/b 
./a/b/c 
./a/b/c/d 

Nach ./a zuerst bewegt wird, werden Sie nur die Fehlermeldung erhalten ‚keine solche Datei oder das Verzeichnis‘ alle subdirs.

Sie sollten einfach mv */ /another/place verwenden - der Schrägstrich auf dem Platzhalter beschränkt die Erweiterung auf nur Verzeichnisse.

35

Mit BSD xargs (für OS X und FreeBSD) können Sie -J verwenden, die für dieses Jahr:

find . -name some_pattern -print0 | xargs -0 -J % mv % target_location 

Das wäre alles passend some_pattern in .-target_location

Mit GNU xargs bewegen (für Linux und Cygwin), verwenden Sie stattdessen -I:

find . -name some_pattern -print0 | xargs -0 -I % mv % target_location 

Die veraltete -i Option von GNU xargs impliziert -I{} und kann wie folgt verwendet werden:

find . -name some_pattern -print0 | xargs -0 -i mv {} target_location 

Beachten Sie, dass BSD xargs auch eine -I Option hat, aber das macht etwas anderes.

+0

Auf Solaris habe ich verwendet: 'finden. -name some_pattern | xargs -I% mv% ziel_lokation'. Vielen Dank –

3
find ./ -maxdepth 1 -name "some-dir" -type d -print0 | xargs -0r mv -t x/ 

finden: mit Option -print0, wird die Ausgabe mit '\ 0' enden;

xargs: mit Option -0, wird es args geteilt durch '\ 0' aber Leerzeichen bedeutet -r no-Lauf wenn leer, so dass Sie keine Fehler erhalten, wenn find keine Ausgabe erhalten haben . (Die -r ist eine GNU-Erweiterung.)

Normalerweise verwende ich dies in Skripten, wenn ich nicht sicher bin, ob die Zieldateien existieren oder nicht.