find . -type f |
sed -n "s/\(.*\)factory\.py$/& \1service\.py/p" |
xargs -p -n 2 mv
eg renommera tous les fichiers dans le cwd avec des noms se terminant par "factory.py" pour les remplacer par des noms se terminant par "service.py".
l'explication :
1) dans la commande sed, l'option -n supprime le comportement normal de l'écho de l'entrée vers la sortie après l'application de la commande s///, et l'option p sur s/// force l'écriture vers la sortie si une substitution est faite. puisqu'une substitution ne sera faite que sur une correspondance, sed n'aura une sortie que pour les fichiers se terminant par "factory.py".
2) dans la chaîne de remplacement s///, nous utilisons "& " pour interpoler l'intégralité de la chaîne correspondante, suivie d'un caractère d'espacement, dans le remplacement. pour cette raison, il est vital que notre ER corresponde à l'intégralité du nom de fichier. après le caractère d'espacement, nous utilisons " \1service.py " pour interpoler la chaîne de caractères que nous avons avalée avant "factory.py", suivi de "service.py", en la remplaçant. Donc, pour des transformations plus complexes, vous devrez changer les args en s/// (avec un re correspondant toujours au nom de fichier entier).
exemple de sortie :
foo_factory.py foo_service.py
bar_factory.py bar_service.py
3) nous utilisons xargs avec -n 2 pour consommer la sortie de sed 2 chaînes délimitées à la fois, en les passant à mv (j'ai aussi mis l'option -p pour que vous puissiez vous sentir en sécurité lorsque vous exécutez ceci). voila.
0 votes
Je suggère de lire les pages de manuel pour mv
0 votes
Question connexe : Meilleur moyen de renommer des fichiers en fonction de plusieurs motifs .
0 votes
Bon fil conducteur : unix.stackexchange.com/questions/116753/
0 votes
Renommer 's/.+( \d {3}: ?) \.jpg /chaîne$1.jpg/g' *.jpg