Ich versuche das und es funktioniert nicht:
ls file_* | xargs mv {} temp/
Irgendwelche Ideen?
Ich versuche das und es funktioniert nicht:
ls file_* | xargs mv {} temp/
Irgendwelche Ideen?
Antworten:
Unter OS X:
ls file_* | xargs -J {} mv {} temp/
Unter Linux:
ls file_* | xargs -i {} mv {} temp/
/am Ende optional. Sie können es einschließen, wenn Sie möchten, aber es ist nicht erforderlich.
-i(oder -J) geben Sie ein Token an, das durch die eingehenden Argumente ersetzt wird, anstatt sie nur am Ende anzuheften . man xargs
-i{} ohne Leerzeichen sagen . Oder sagen -I {}.
-iist, er wird ersetzt. ls file_* | xargs -iFOO mv FOO temp/funktioniert genauso.
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.
file_*Dateien im aktuellen Verzeichnis zu verarbeiten, während find(ohne zusätzliche Optionen) der gesamte Verzeichnisbaum unter dem aktuellen Verzeichnis durchsucht wird.
mves egal ist, ob Sie Dateien zusammen oder einzeln verarbeiten, kann dies bei einigen anderen Anwendungen der Fall sein.
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
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.
xargs -n10zum Beispiel)