Table des matières
Introduction
Cet article présente un script bash en vue de renommer de manière automatique certains fichiers d'un dossier, et notamment ceux qui ont des espaces ou blancs.
Dans la plupart des systèmes d'exploitation, y compris windaube, passer des noms de fichiers en arguments peut devenir rapidement problématique s'ils contiennent des blancs, car ces blancs ont sauf précautions particulières l'effet de créer plusieurs arguments, ce qui va au mieux faire planter le traitement, au pire effectuer des actions non souhaitées.
Le script effectue encore d'autres traitements, par exemple la suppression de certains caractères spéciaux et la factorisation de caractères consécutifs identiques. Il a été conçu à l'origine pour modifier des noms de chansons mp3 ou ogg “rippées” à partir d'un CD ou obtenues par d'autres sources (de manière légale s'entend ), ces noms étant souvent un vrai charabia pas du tout adapté aux “us et coutumes” d'un “Linuxien de base”…
Article rédigé par Jeanmm
Version initiale : 17/06/2006.
Le script
Le script contient assez de commentaires pour expliquer les traitements réalisés. On donne à la suite quelques remarques complémentaires. On pourra donc l'adapter à ses besoins, par exemple en supprimer une partie ou s'en inspirer pour réaliser d'autres traitements complémentaires.
#!/bin/sh # Suppression des blancs, () et [] dans les noms des fichiers # du dossier courant et remplacement par des "_" factorises. # Et quelques autres bidouilles expliquees dans le code. # Les fichiers modifies sont listes. # Auteur : Jeanmm # Date : juin 2006 # Licence : GPL # Lien : http://www.root66.net/accueil/ # Suppression des blancs, () et [], # Factorisation des "_", # Suppression des apostrophes. for a in * ; do b=$(echo "$a" | tr " ()[]" "_____" | tr -s _ _ | tr -d "'" ) if [ "$a" != "$b" ] ; then echo "mv \"$a\" \"$b\"" mv "$a" "$b" fi done # Conversion des "_-_" en "_" for a in * ; do b=$(echo $a | sed 's/_-_/_/g'); if [ "$a" != "$b" ] ; then echo "mv $a $b" mv $a $b; fi done # Conversion des "_-" en "_" for a in * ; do b=$(echo $a | sed 's/_-/_/g'); if [ "$a" != "$b" ] ; then echo "mv $a $b" mv $a $b; fi done # Conversion des "-_" en "_" for a in * ; do b=$(echo $a | sed 's/-_/_/g'); if [ "$a" != "$b" ] ; then echo "mv $a $b" mv $a $b; fi done # Suppression des "_" en debut de nom for a in * ; do b=$(echo $a | sed 's/^_//'); if [ "$a" != "$b" ] ; then echo "mv $a $b" mv $a $b; fi done # Suppression des "_" en fin de nom for a in * ; do b=$(echo $a | sed 's/_$//'); if [ "$a" != "$b" ] ; then echo "mv $a $b" mv $a $b; fi done # Conversion des ",_" en "_" for a in * ; do b=$(echo $a | sed 's/,_/_/g'); if [ "$a" != "$b" ] ; then echo "mv $a $b" mv $a $b; fi done # Conversion des "._" en "_" for a in * ; do b=$(echo $a | sed 's/\._/_/g'); if [ "$a" != "$b" ] ; then echo "mv $a $b" mv $a $b; fi done # Conversion des "_." en "." for a in * ; do b=$(echo $a | sed 's/_\./\./g'); if [ "$a" != "$b" ] ; then echo "mv $a $b" mv $a $b; fi done
Explications
Ce script met en oeuvre deux outils couramment utilisés en mode commande pour modifier du texte :
- tr : outil qui permet de traduire certains caractères en d'autres, factoriser des caractères consécutifs et supprimer certains caractères,
- sed : éditeur de texte qui est avec awk l'un des plus utilisés en ligne de commande. Les anciens qui ont connu les premiers éditeurs de texte avant l'accès direct au texte par une souris n'auront aucun mal à en maitriser la syntaxe.
Pour plus d'infos sur ces outils on consultera les “pages man” ou l'abondante littérature sur le web.
En regardant bien le script on remarquera une petite nuance entre les 2 premières commandes echo :
echo "$a" echo $a
La variable $a contenant le nom d'un fichier, dans le premier cas on ne sait pas s'il y a des blancs ou non, on s'en prémunit en englobant $a avec des guillemets doubles. Dans le second cas ces guillemets sont inutiles car on vient tout juste d'éliminer les blancs. On voit donc que la syntaxe est plus contraignante si on ne connait rien des noms de fichiers, et si on omet ces précautions on pourrait aboutir aux erreurs de traitements redoutées.