Spostamento di file con find + xargs: target non è una directory?


9

Quando eseguo il seguente comando:

> mkdir some_dir
> find /foo/bar/ -name '*.csv' -print0 | xargs -0 mv {} some_dir

Ricevo centinaia di righe che dicono:

mv: target `/foo/bar/XX.csv` is not a directory

Perché? Ho pensato che xargs avrebbe eseguito:

mv /foo/barXX.csv some_dir

per ogni file che findtrova. Cosa sta succedendo? A proposito, questo è con zsh

Aggiornare:

Update1:

Provai:

find /foo/bar/ -name '*.csv' -print0 | xargs -0 mv {} -t some_dir

ma poi ho ottenuto alcune righe come:

mv: cannot stat `{}': No such file or directory

anche se penso che il comando stia spostando correttamente i miei file.

Update2:

Non ho bisogno -tdell'opzione quando uso mvda solo. Per esempio

> touch file1.txt
> touch file2.txt
> mkdir my_dir
> mv  file1.txt  file2.txt  my_dir

funziona bene. Perché ho bisogno -tquando uso xargs?

Risposte:


14

Supponendo di avere GNU ( find, xargs, e mv), modificare il comando per questo:

$ find /foot/bar/ -name '*.csv' -print0 | xargs -0 mv -t some_dir

estratto dalla mvpagina man

   -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY

Quanto sopra xargs ...costruirà il comando in modo che le chiamate a spostare siano così:

 $ mv 1.csv 2.csv 3.csv ... -t some_dir

Non ho bisogno di xargs

Puoi saltare questo approccio semplicemente facendo findtutto il lavoro stesso:

$ find /foot/bar/ -name '*.csv' -exec mv -t some_dir {} +

Perché hai bisogno del mv -t ...?

Questo ha a che fare con il modo in cui xargssta costruendo il set di file da passare al comando che verrà eseguito ogni volta, (cioè mv ...).

Quando esegui mvmanualmente il comando, controlli quanti nomi di file gli vengono passati e quindi non devi preoccuparti di averne bisogno -t my_dirpoiché metterai sempre l'ultima directory di destinazione.

Riferimenti


Grazie! Questo è molto utile Sono un po 'confuso (vedi i miei aggiornamenti)
Amelio Vazquez-Reina,

1
Il comando costruito è mv -t some_dir 1.csv 2.csv 3.csv ...quindi gli argomenti del file sono gli ultimi. Questo è l'errore in questione, al fine di utilizzare {}devi passare -I {}a xargs.
frostschutz,

Grazie. Questo spiega tutto. Che dire della seconda domanda che ho avuto nell'aggiornamento 2? Sai perché non ho bisogno -tdi più file e una directory con un normale mv?
Amelio Vazquez-Reina,

1
@ user815423426 - Lo aggiornerò più tardi quando avrò una possibilità stasera, so perché.
slm

@ user815423426 - Ho aggiornato la domanda, fammi sapere se ha senso mv -t.
slm

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.