Ce qui suit est une solution directe de votre approche:
find . -type f -name 'file*' -exec sh -c 'x="{}"; mv "$x" "${x}_renamed"' \;
Cependant, cela coûte très cher si vous avez beaucoup de fichiers correspondants, car vous démarrez un nouveau shell (qui exécute a mv
) pour chaque correspondance. Et si vous avez des personnages amusants dans n'importe quel nom de fichier, cela va exploser. Une approche plus efficace et sécurisée est la suivante:
find . -type f -name 'file*' -print0 | xargs --null -I{} mv {} {}_renamed
Il a également l'avantage de travailler avec des fichiers étrangement nommés. Si le find
supporte, cela peut être réduit à
find . -type f -name 'file*' -exec mv {} {}_renamed \;
La xargs
version est utile lorsque vous n'utilisez pas {}
, comme dans
find .... -print0 | xargs --null rm
Ici, rm
on appelle une fois (ou plusieurs fois avec plusieurs fichiers), mais pas pour tous les fichiers.
J'ai enlevé la basename
question en vous, parce que c'est probablement faux: vous iriez foo/bar/file8
à file8_renamed
, pas foo/bar/file8_renamed
.
Modifications (comme suggéré dans les commentaires):
- Ajouté raccourci
find
sansxargs
- Ajout de la vignette de sécurité
x
est inutile: lesfind . -type f -name 'file*' -exec mv {} "{}_renamed" \;
xargs
versions ont la même efficacité que le premier exemple /