Renommer des fichiers en masse

image de dossiers

L'autre jour j'ai eu besoin de renommer rapidement un nombre important de fichiers en remplaçant un caractère par un autre.
Dans mon cas il s'agissait de supprimer le caractère souligné (_) dans un groupe de fichiers nommés "image_n.jpg" ou n était un numéro, et de remplacer ce caractère par rien, une simple suppression de caractère en somme.

Si vous n'êtes pas sur de ce que vous faites remplacez la commande mv par cp

Placez vous dans le répertoire où se trouvent vos fichiers à modifier et adaptez l'une des commandes suivantes selon vos besoins.

Supprimer un caractère avec la commande sed:

Dans cet exemple, seul la première occurrence trouvée est remplacée.

for i in *.jpg
do
    mv $i `echo $i | sed 's/_//'`
done

Le s de la commande sed signifie substitution, on comprend mieux la présence des trois barres obliques (slash) puisqu'on substitue le caractère souligné (_) par rien. Les barres obliques sont donc des délimiteurs. Ainsi si on avait souhaiter remplacer ce caractère souligné par un tiret (-) on aurait écrit la commande ci-dessous.

Remplacer un caractère par un autre avec la commande sed

Nous retrouvons ici la même commande, on à simplement ajouté le caractère tiret (-) par lequel on souhaite remplacer le caractère souligné (_). On a également ajouter le drapeau (flag) "g" pour remplacer toutes les occurrences trouvées.

for i in *.jpg
do
    mv $i `echo $i | sed 's/_/-/g'`
done

Si le caractère que vous souhaitez remplacer est un des caractères spéciaux des expressions régulières comme par exemple le point (.), alors pensez à l'échapper:

for i in *.jpg
do
    mv $i `echo $i | sed 's/\./-/g'`
done

Enfin si le nom du fichier que vous renommez contient des espaces (image 001.jpg) vous risquez de vous retrouver avec un message d'erreur du genre:

mv: la cible '001.jpg' n'est pas un répertoire

En effet la commande mv à interprété l'espace comme la fin de la première instruction. Vous devrez alors avoir recours ce genre de subtilité:

for i in *.jpg
do
    j=`echo $i | sed 's/_/ /g'`
    mv $i "$j"
done

Supprimer un caractère avec la commande tr:

for i in *.png
    do mv $i `echo $i | tr -d _`
done

Remplacer un caractère par un autre avec la commande tr

for i in *.png
    do mv $i `echo $i | tr _ s`
done

Libre à vous d'utiliser ces commandes dans un script bash ou directement dans le shell avec la console.

23-Dec-2021
^