Jak przenosić pliki za pomocą xargs w systemie Linux?

24

Próbuję tego i to nie działa:

ls file_* | xargs mv {} temp/

Jakieś pomysły?

Peter Mortensen
źródło
Czy ktoś ma wersję przenoszenia wielu plików? ( xargs -n10na przykład)
Gert van den Berg

Odpowiedzi:

31

W systemie OS X:

ls file_* | xargs -J {} mv {} temp/

W systemie Linux:

ls file_* | xargs -i {} mv {} temp/
Amadan
źródło
1
W Linuksie przynajmniej /koniec jest opcjonalny. Możesz dołączyć, jeśli chcesz, ale nie jest to konieczne.
Scott
4
@ user1953864: -i(lub -J) podaj token, który zostanie zastąpiony przychodzącymi argumentami, zamiast po prostu sczepiony na końcu. man xargs
Amadan
14
Być może będziesz musiał powiedzieć -i{}bez spacji. Lub powiedz -I {}.
Scott
1
Zauważam, że użycie „%” zamiast „{}” również działa - co oznacza%, a co {}? Przykład: ls plik_ * | xargs -I% mv% temp /
dmonopoly
3
@dmonopoly: Nic nie znaczą . Niezależnie od tego -i, jaki jest parametr , jest on zastępowany. ls file_* | xargs -iFOO mv FOO temp/działa dokładnie tak samo.
Amadan
8

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ę.

David-SkyMesh
źródło
2
Zauważ, że pytanie sugeruje chęć przetwarzania tylko file_*plików w bieżącym katalogu, podczas gdy find(bez dodatkowych opcji) przeszuka całe drzewo katalogów w bieżącym katalogu.
Scott
1
Tak, prawda. Dodaj, -maxdepth 0aby temu zapobiec.
„lepszy” jest subiektywny. Bardziej wydajny, bardziej złożony i wolniejszy; i chociaż mvnie ma znaczenia, czy pliki są przetwarzane razem czy osobno, niektóre inne zastosowania mogą.
Amadan
Edytowano (dodano -maxdepth 0)
8

Użyj -t „określ docelowy katalog” w mv, powinno działać przenoszenie plików * do docelowego katalogu / temp

np .: - #ls -l plik * | xargs mv -t / temp

Ratheesh
źródło
4

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
mdk
źródło
0

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.

Basile Starynkevitch
źródło