Próbuję tego i to nie działa:
ls file_* | xargs mv {} temp/
Jakieś pomysły?
Próbuję tego i to nie działa:
ls file_* | xargs mv {} temp/
Jakieś pomysły?
Odpowiedzi:
W systemie OS X:
ls file_* | xargs -J {} mv {} temp/
W systemie Linux:
ls file_* | xargs -i {} mv {} temp/
/koniec jest opcjonalny. Możesz dołączyć, jeśli chcesz, ale nie jest to konieczne.
-i(lub -J) podaj token, który zostanie zastąpiony przychodzącymi argumentami, zamiast po prostu sczepiony na końcu. man xargs
-i{}bez spacji. Lub powiedz -I {}.
-i, jaki jest parametr , jest on zastępowany. ls file_* | xargs -iFOO mv FOO temp/działa dokładnie tak samo.
find . -name "file_*" -maxdepth 0 -exec mv {} temp/ \;
findjest lepszy niż lstam, gdzie może być więcej plików niż liczba argumentów programu dozwolonych przez twoją powłokę.
file_*plików w bieżącym katalogu, podczas gdy find(bez dodatkowych opcji) przeszuka całe drzewo katalogów w bieżącym katalogu.
mvnie ma znaczenia, czy pliki są przetwarzane razem czy osobno, niektóre inne zastosowania mogą.
Zgodnie z sugestią @ user1953864: { -i, -J} podaj token, który zostanie zastąpiony przychodzącymi argumentami.
Na przykład ls:
something.java exampleModel.java NewsQueryImpl.java readme someDirectory/
Następnie przeniesienie wszystkich plików Java do folderu someDirectory za pomocą xargs:
W systemie Linux
ls *.java | xargs -i mv {} someDirectory/
Na MacOS
ls *.java | xargs -J mv {} someDirectory
Innym rozwiązaniem może być:
for f in file_* ; do
mv $f temp/$f
done
Wadą jest to, że forsuje nowy mvproces dla każdego pliku.
xargs -n10na przykład)