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/ \;
find
jest lepszy niż ls
tam, 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.
mv
nie 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 mv
proces dla każdego pliku.
xargs -n10
na przykład)