Wie kann ich Dateien mit xargs unter Linux verschieben?

24

Ich versuche das und es funktioniert nicht:

ls file_* | xargs mv {} temp/

Irgendwelche Ideen?

Peter Mortensen
quelle
Wer mit einer Multi-File-Move-Version davon? ( xargs -n10zum Beispiel)
Gert van den Berg

Antworten:

31

Unter OS X:

ls file_* | xargs -J {} mv {} temp/

Unter Linux:

ls file_* | xargs -i {} mv {} temp/
Amadan
quelle
1
Zumindest unter Linux ist das /am Ende optional. Sie können es einschließen, wenn Sie möchten, aber es ist nicht erforderlich.
Scott
4
@ user1953864: -i(oder -J) geben Sie ein Token an, das durch die eingehenden Argumente ersetzt wird, anstatt sie nur am Ende anzuheften . man xargs
Amadan
14
Sie müssen möglicherweise-i{} ohne Leerzeichen sagen . Oder sagen -I {}.
Scott
1
Ich stelle fest, dass die Verwendung von "%" anstelle von "{}" ebenfalls funktioniert. Was bedeutet% und was bedeutet {}? Beispiel: ls file_ * | xargs -I% mv% temp /
dmonopoly
3
@dmonopoly: Sie haben nichts zu bedeuten . Was auch immer der Parameter -iist, er wird ersetzt. ls file_* | xargs -iFOO mv FOO temp/funktioniert genauso.
Amadan
8

find . -name "file_*" -maxdepth 0 -exec mv {} temp/ \;

findist besser als dort, lswo möglicherweise mehr Dateien als die Anzahl der von Ihrer Shell zugelassenen Programmargumente vorhanden sind.

David-SkyMesh
quelle
2
Beachten Sie, dass die Frage den Wunsch nahelegt, nur die file_*Dateien im aktuellen Verzeichnis zu verarbeiten, während find(ohne zusätzliche Optionen) der gesamte Verzeichnisbaum unter dem aktuellen Verzeichnis durchsucht wird.
Scott
1
Ja stimmt. Hinzufügen -maxdepth 0, um dies zu verhindern.
"besser" ist subjektiv. Stärker, komplexer und langsamer; und während mves egal ist, ob Sie Dateien zusammen oder einzeln verarbeiten, kann dies bei einigen anderen Anwendungen der Fall sein.
Amadan
Bearbeitet (hinzugefügt -maxdepth 0)
8

Verwenden Sie -t "Zielverzeichnis angeben" bei mv. Es sollte funktionieren, Dateien * in das Zielverzeichnis / temp zu verschieben

Beispiel: - #ls -l Datei * | xargs mv -t / temp

Ratheesh
quelle
4

Wie von @ user1953864 vorgeschlagen: { -i, -J} Geben Sie ein Token an, das durch die eingehenden Argumente ersetzt wird.

Zum Beispiel ls:

something.java  exampleModel.java  NewsQueryImpl.java  readme someDirectory/

Dann, um alle Java-Dateien in den someDirectory-Ordner mit zu verschieben, xargswäre wie folgt:

Unter Linux

ls *.java | xargs -i mv {} someDirectory/

Auf MacOS

ls *.java | xargs -J mv {} someDirectory
mdk
quelle
0

Eine andere Lösung könnte sein:

 for f in file_* ; do
   mv $f temp/$f
 done

Der Nachteil ist, dass es mvfür jede Datei einen neuen Prozess gibt.

Basile Starynkevitch
quelle