Wie kann ich Dateien mit xargs unter Linux verschieben?


24

Ich versuche das und es funktioniert nicht:

ls file_* | xargs mv {} temp/

Irgendwelche Ideen?


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/

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.


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


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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.