Come posso spostare i file con xargs su Linux?


24

Sto provando questo e non funziona:

ls file_* | xargs mv {} temp/

Qualche idea?


Qualcuno con una versione di spostamento di più file di questo? ( xargs -n10ad esempio)
Gert van den Berg,

Risposte:


31

Su OS X:

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

Su Linux:

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

1
Su Linux, almeno, /alla fine è facoltativo. Puoi includerlo se vuoi, ma non è necessario.
Scott,

4
@ user1953864: -i(o -J) specifica un token che verrà sostituito con gli argomenti in arrivo, invece che essere semplicemente incollato alla fine. man xargs
Amadan,

14
Si potrebbe bisogno di dire -i{}, senza uno spazio. O dire -I {}.
Scott,

1
Ho notato che anche l'uso di "%" al posto di "{}" funziona: cosa significa% e cosa significa {}? Esempio: ls file_ * | xargs -I% mv% temp /
dmonopoly

3
@dmonopoly: non significano nulla. Qualunque sia il parametro -i, viene sostituito. ls file_* | xargs -iFOO mv FOO temp/funziona esattamente lo stesso.
Amadan,

8

find . -name "file_*" -maxdepth 0 -exec mv {} temp/ \;

findè migliore di lsdove potrebbero esserci più file rispetto al numero di argomenti del programma consentiti dalla shell.


2
Si noti che la domanda suggerisce il desiderio di elaborare solo i file_*file nella directory corrente, mentre find(senza opzioni aggiuntive) cercherà l'intero albero della directory nella directory corrente.
Scott,

1
Sì vero. Aggiungi -maxdepth 0per evitare questo.

"migliore" è soggettivo. Più potente, più complesso e più lento; e mentre mvnon importa se si elaborano i file insieme o individualmente, alcuni altri usi potrebbero.
Amadan,

Modificato (aggiunto -maxdepth 0)

8

Usa -t "specifica destinazione directoty" su mv, dovrebbe funzionare spostando i file * nella directory di destinazione / temp

es: - #ls -l file * | xargs mv -t / temp


4

Come suggerito da @ user1953864: { -i, -J} specifica un token che verrà sostituito con gli argomenti in arrivo.

Per esempio ls:

something.java  exampleModel.java  NewsQueryImpl.java  readme someDirectory/

Quindi spostare tutti i file java nella cartella someDirectory con xargssarebbe il seguente:

Su Linux

ls *.java | xargs -i mv {} someDirectory/

Su MacOS

ls *.java | xargs -J mv {} someDirectory

0

Un'altra soluzione potrebbe essere:

 for f in file_* ; do
   mv $f temp/$f
 done

Lo svantaggio è che crea un nuovo mvprocesso per ogni file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.