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?


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/

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


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


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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.