Voglio rinominare più file (file1 … fileN in file1_rinomed … fileN_rinomed) usando find
comando:
find . -type f -name 'file*' -exec mv filename='{}' $(basename $filename)_renamed ';'
Ma ottenendo questo errore:
mv: cannot stat ‘filename=./file1’: No such file or directory
Questo non funziona perché il nome del file non è interpretato come variabile di shell.
Risposta accettata:
Quello che segue è una correzione diretta del tuo approccio:
find . -type f -name 'file*' -exec sh -c 'x="{}"; mv "$x" "${x}_renamed"' \;
Tuttavia, questo è molto costoso se hai molti file corrispondenti, perché avvii una nuova shell (che esegue un mv
) per ogni partita. E se hai caratteri divertenti in qualsiasi nome di file, questo esploderà. Un approccio più efficiente e sicuro è questo:
find . -type f -name 'file*' -print0 | xargs --null -I{} mv {} {}_renamed
Ha anche il vantaggio di lavorare con file con nomi strani. Se find
lo supporta, questo può essere ridotto a
find . -type f -name 'file*' -exec mv {} {}_renamed \;
Il xargs
versione è utile quando non si utilizza {}
, come in
find .... -print0 | xargs --null rm
Qui rm
viene chiamato una volta (o con molti file più volte), ma non per tutti i file.
Ho rimosso il basename
nella tua domanda, perché probabilmente è sbagliato:sposteresti foo/bar/file8
a file8_renamed
, non foo/bar/file8_renamed
.
Modifiche (come suggerito nei commenti):
- Aggiunto
find
abbreviato senzaxargs
- Aggiunto adesivo di sicurezza