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 /x
n'est là que pour fixer directement l'approche du demandeur.{}
directement dans unesh -c "…"
commande shell ( ) - vous devriez toujours le transmettre en argument. (2) Toutes les versions defind
supportent la{}_renamed
construction. (3) Je ne comprends pas votre affirmationxargs
utile pour supprimer des fichiers (par opposition à les renommer).xargs
n'est pasmv
vsrm
, mais utilisation de{}
vs sans. La première est semblable àmv file1 file1_renamed; mv file2 file2_renamed
la dernièrerm file1 file2
.