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 findsupporta, questo può essere ridotto a
find . -type f -name 'file*' -exec mv {} {}_renamed \;
La xargsversione è utile quando non si utilizza {}, come in
find .... -print0 | xargs --null rm
Qui rmviene chiamato una volta (o con molti file più volte), ma non per tutti i file.
Ho rimosso il basenamein te domanda, perché è probabilmente sbagliato: ci si sposta foo/bar/file8a file8_renamed, non è foo/bar/file8_renamed.
Modifiche (come suggerito nei commenti):
- Aggiunto abbreviato
findsenzaxargs
- Aggiunto adesivo di sicurezza
xsia inutile: lafind . -type f -name 'file*' -exec mv {} "{}_renamed" \;xargsversione ha la stessa efficienza del primo esempio /