Di seguito è 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 shell nuova (che esegue un mv
) per ogni corrispondenza. E se hai personaggi 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 lo find
supporta, questo può essere ridotto a
find . -type f -name 'file*' -exec mv {} {}_renamed \;
La 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
in te domanda, perché è probabilmente sbagliato: ci si sposta foo/bar/file8
a file8_renamed
, non è foo/bar/file8_renamed
.
Modifiche (come suggerito nei commenti):
- Aggiunto abbreviato
find
senzaxargs
- Aggiunto adesivo di sicurezza
x
sia inutile: lafind . -type f -name 'file*' -exec mv {} "{}_renamed" \;
xargs
versione ha la stessa efficienza del primo esempio /