Il arrive parfois qu’il soit nécessaire de changer le nom de plusieurs dizaines de fichiers en une seule passe. Changer l’extension d’images, supprimer le numéro de morceau sur des fichiers mp3 (01 - Orly ; 02 - Les marquises…).
Il existe des utilitaires avec une interface graphique pour faire ce genre de chose. Mais voilà, il s’agit du blog de l’admin, il faut donc faire cela à la ligne de commande.
1/ Changer l’extension de plusieurs fichiers
Supposons que dans le répertoire courant nous avons 239 fichiers .JPG qui sont en réalité des fichiers PNG. Il faut modifier l’extension de ces fichiers. La première possibilité est d’utiliser la commande mv :
# mv image001.JPG image001.PNG
Cela risque vite de vous lasser.
Il faut utiliser mv bien sûr, mais couplé aux possibilités de boucle du shell :
for fichier in *.JPG
>do
>echo $fichier
>done
Affiche la liste des fichiers sélectionnés.
Regardons maintenant la page de manuel de la commande basename… Et essayons ceci :
basename image001.JPG .JPG
image001
L’extension a été retirée !!!
Notre boucle s’articule maintenant autour de basename
for fichier in *.JPG
>do
>new_fic=`basename $fichier .JPG`
>mv $fichier $new_fic.png
>done
Et voilà !
2/ Supprimer le numéro de morceaux de fichier mp3 fraîchement ripés
Cette fois, au lieu d’avoir à changer l’extension, c’est le début du nom d’un fichier que nous allons supprimer :
01 - Orly.mp3
basename ne va pas pouvoir nous servir.
Cette fois, ce sont les expressions rationnelles (ou régulières) qui vont nous aider.
Analysons la partie que nous devons supprimer. Elle se compose de deux chiffres, de 0 à 9, d’un espace, d’un tiret et d’un autre espace.
La plage des chiffres de 0 à 9 s’exprime [0-9]. On pourrait mettre deux fois ce motif pour rechercher tous les fichiers avec un préfixe de 0 à 99. Seulement, voilà, comble de malchance, vos fichiers vont plus loin… et puis, sait-on jamais.
Nous allons donc utiliser ce motif en le faisant suivre du caractère * signifiant “autant de fois que nécessaire” :-). On y ajoute la suite de ce que l’on recherche, “espace-espace” et nous pouvons déjà tenter avec le ls
% ls *.mp3 | sed -e "s/[0-9]* - //”
fichier 1.mp3
fichier 2.mp3
fichier 3.mp3
fichier 4.mp3
fichier 5.mp3
fichier 6.mp3
fichier 7.mp3
fichier 8.mp3
fichier 9.mp3
Volià la solution, il ne reste plus qu’à faire la boucle :
% for i in *.mp3
do
new=`echo $i | sed -e "s/[0-9]* - //”`
mv $i $new
done
Magique non ?
Des experts des expressions rationnelles auront sans doute remplacé les espaces autour du tiret par un . (point), qui remplace n’importe quel caractère, une fois.
A vous de jouer !
Recent Comments