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 {}
.
-i
ist, er wird ersetzt. ls file_* | xargs -iFOO mv FOO temp/
funktioniert genauso.
find . -name "file_*" -maxdepth 0 -exec mv {} temp/ \;
find
ist besser als dort, ls
wo 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.
mv
es 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, xargs
wä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 mv
für jede Datei einen neuen Prozess gibt.
xargs -n10
zum Beispiel)