173 votes

Renommer plusieurs fichiers en remplaçant un motif particulier dans les noms de fichiers en utilisant un script shell.

Ecrivez un simple script qui renommera automatiquement un certain nombre de fichiers. Par exemple, nous voulons que le fichier *001.jpg soit renommé en chaîne de caractères définie par l'utilisateur + 001.jpg (ex : MyVacation20110725_001.jpg). L'utilisation de ce script est d'obtenir que les photos de l'appareil photo numérique aient des noms de fichiers qui ont un certain sens.

Je dois écrire un shell script pour cela. Quelqu'un peut-il me suggérer comment commencer ?

0 votes

Je suggère de lire les pages de manuel pour mv

0 votes

0 votes

332voto

Susam Pal Points 6171

Un exemple pour vous aider à décoller.

for f in *.jpg; do mv "$f" "$(echo "$f" | sed s/IMG/VACATION/)"; done

Dans cet exemple, je suppose que tous vos fichiers image contiennent la chaîne de caractères IMG et vous voulez remplacer IMG avec VACATION .

Le shell évalue automatiquement *.jpg à tous les fichiers correspondants.

Le deuxième argument de mv (le nouveau nom du fichier) est la sortie de la commande sed qui remplace la commande IMG avec VACATION .

Si vos noms de fichiers comportent des espaces, faites attention à l'option "$f" notation. Vous avez besoin des guillemets pour préserver les espaces.

189voto

ted Points 355

Vous pouvez utiliser renommer Utilitaire permettant de renommer plusieurs fichiers selon un modèle. Par exemple, la commande suivante ajoutera la chaîne MyVacation2011_ à tous les fichiers portant l'extension jpg.

rename 's/^/MyVacation2011_/g' *.jpg

ou

rename <pattern> <replacement> <file-list>

0 votes

Mais il doit y avoir des variantes de cette commande, rename est juste comme mv sur mon RedHat 6.5.

1 votes

Cela n'a pas fonctionné pour moi, car j'avais trop de fichiers : -bash: /usr/bin/rename: Argument list too long . Mais je suis d'accord que c'est bien si vous avez une liste plus petite.

9 votes

@ixe013 Ce renommage est une version perl, pas un utilitaire intégré. Suivez le guide à stackoverflow.com/questions/22577767/ à installer.

43voto

RJ Alten Points 131
for file in *.jpg ; do mv $file ${file//IMG/myVacation} ; done

Supposons à nouveau que tous vos fichiers d'image contiennent la chaîne "IMG" et que vous souhaitiez remplacer "IMG" par "myVacation".

Avec bash, vous pouvez directement convertir la chaîne avec expansion des paramètres .

Exemple : i mv sera exécutée comme si vous faisiez mv IMG_327.jpg myVacation_327.jpg . Et cela sera fait pour chaque fichier trouvé dans le répertoire correspondant. *.jpg .

IMG_001.jpg -> myVacation_001.jpg
IMG_002.jpg -> myVacation_002.jpg
IMG_1023.jpg -> myVacation_1023.jpg
etcetera...

40voto

Sujit Dhamale Points 443

Dans cet exemple, je suppose que tous vos fichiers image commencent par "IMG" et que vous voulez remplacer "IMG" par "VACATION".

solution : d'abord identifier tous les fichiers jpg et ensuite remplacer le mot clé.

find . -name '*jpg' -exec bash -c 'echo mv $0 ${0/IMG/VACATION}' {} \;

4 votes

C'est la meilleure réponse car elle permet de traverser l'arborescence des répertoires, utilise des utilitaires bash intégrés et est facilement configurable. De plus, l'exemple donne le test non destructif pour s'assurer que les changements sont corrects.

6 votes

Juste une note ici... assez évidente mais qui vaut la peine d'être soulignée : la 'echo mv $0 ${0/IMG/VACATION}' est la commande réelle qui sera exécutée pour chaque fichier trouvé. Ainsi, si vous laissez la partie echo là, il ne fera que répercuter ce qu'il ferait. Enlevez le echo pour déplacer réellement les fichiers, par exemple. find . -name '*jpg' -exec bash -c 'mv $0 ${0/IMG/VACATION}' {} \;

2 votes

Félicitations pour avoir inclus echo afin que les utilisateurs sachent si cela fonctionnera ou non

5voto

john Points 280
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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X