Changer des noms de fichiers massivement avec Bash
Lors d’extractions de résultats j’ai eu un problème de nommage de fichiers.
Mes fichiers auraient du s’appeler comme suit :
fichier_0000001
fichier_0000002
etc…
Hélas une erreur de manip les as rendu comme suit:
fichier_0000010
fichier_0000020
etc…
Rendant le post-traitement impossible, ou presque…
Bien sûr la manip que je vais vous présenter peux être adaptée à d’autres situations. Et pour renommer des fichiers on peut utiliser le bon logiciel pyRename (dans les dépôts Ubuntu). Et on trouve de bons tutoriels sur le sujet.
Comme l’information n’est pas toujours facile à trouver, je cite les deux sources qui m’ont beaucoup aidé :
http://chrischan.blog-city.com/bash_pattern_substitution.htm
http://www.laboiteaprog.com/article-99-3-bash_les_chaines_de_caracteres
Je vais donc légèrement les paraphraser et de manière moins complète.
Afin de changer les noms j’ai fait le script bash suivant :
#! /bin/bash
for i in $( ls fichier_* | grep -v case ); do
mv $i ${i/000/0000};
# echo « $i vers ${i/000/0000} »;
# echo « $i vers ${i%0} »;
done
for i in $( ls ens* | grep -v case ); do
mv $i ${i%0};
# echo « $i vers ${i%0} »;
done
Les affichages via echo sont indiqués à titre indicatif et pour vérifier que nous faisons bien les bonnes manips (ils sont commentés via les dièzes).
Je fais la manip en deux temps.
Dans la ligne for i in $( ls fichier_* | grep -v case ); do, je cherche tous les fichiers fichier_* via le ls mais grâce au pipe « | » et le grep -v je retire tous ceux qui ont case dans le nom. Je boucle sur chaque nom de fichier trouvé jusqu’au done.
je fait un moove (mv) du nom de fichier $i vers ${i/000/0000}. Cette seconde commande indique que je vais remplacé une fois trois zéros par quatre ${var/pattern/string}, cad que dans $i je vais remplacé une occurrence pattern par string. Si je veux toutes les remplacées, je mets : ${var//pattern/string}.
Je viens de mettre un 0 de plus devant le chiffre du nom de fichier, par exemple :
fichier_0000010 devient fichier_00000010 (un zéro de plus).
Dans la seconde boucle for, je retire un 0 à la fin du nom de fichiers grâce à a la commande suivante : ${i%0}, je retire le premier 0 en partant de la fin dans $i. % indique que nous partons de la fin pour changer ou retirer une occurrence.
Et voilà le tour est joué.
Je vous conseille la lecture des deux liens donnés, ils sont concis et facile à comprendre.
Pour éxécuter ce script :
Éditer le fichier xxx.sh (xxx où vous mettez ce que vous voulez). Copier-coller le code donné en bleu plus haut. L’adapter à votre cas. vous pouvez le rendre interactif, mais il faut un meilleur niveau en bash.
Dans un Terminal, le rendre exécutable : chmod +x xxx.sh
et l’exécuter dans le répertoire où c’est nécessaire : ./xxx.sh
Vous pouvez aussi l’exécuter depuis l’explorateur en double-cliquant dessus et en cliquant sur l’option : Exécuter dans un terminal (run in a terminal).