Linux, informatique et électronique libre

Renommer des fichiers sous Linux : les expressions régulières

Un petit mémo …

Comme souvent je me retrouve avec plein de fichiers dont le nom ne me convient pas. J’aimerai les renommer suivant mes critères. Sous Linux la commande sed et les expressions régulières permettent de faire à peu près ce que l’on veut. Pour les mathématiciens un bel exemple d’usage de la théorie des ensembles en informatique.

Un exemple :

Nom des fichiers originaux : ENLEVER – 01 – Premier fichier.ooops

Nom des fichiers souhaités : AJOUTER – 01 – Premier fichier – A MOI.ooops

ls | sed -rn "s/^ENLEVER - (.*)\.(.*)/mv '&' 'AJOUTER - \1 - A MOI\.\2'/ p"

-r : pour utiliser les expressions régulières étendues
-n : pour rendre sed silencieux

Ensuite on trouve l’expression régulière, c’est à dire un modèle auquel correspond le nom de fichier

^ : correspond au début du nom de fichier
ENLEVER – : le fichier commence (^) par ENLEVER –
(.*) : les parenthèses indiquent que l’on veut garder précieusement dans la première variable \1 ce qui correspond à l’intérieur de la parenthèse. Le caractère . remplace n’importe quel caractère et * veut dire 0 ou plus, donc .* veut dire que je veux garder tous les caractères qui suivent qu’il y en ait 0 ou plus.
\. : je veux tout les caractères jusqu’à ce que j’arrive à un point, mais comme ce caractère a un sens particulier et que c’est un vrai point que je veux repérer, je protège avec \.

Ainsi \1 devrait contenir 01 – Premier fichier

(.*)/ : je récupère maintenant tous les caractères qui suivent le point de l’extension, c’est à dire oooops et cela va dans \2

Maintenant on construit la commande :

mv ‘&’ ‘AJOUTER – \1 – A MOI\.\2’/ p : c’est la commande mv classique, & désigne le fichier de départ puis suit ma nouvelle version où j’utilise /1 et /2 pour réécrire ce que j’ai sélectionné dans l’expression régulière. Le /p à la fin est juste pour imprimer le résultat.

La ligne écrite ci-dessus est en fait inoffensive, elle se contente d’imprimer le résultat de mon bricolage. Il faut rajouter |sh à la fin pour confier au shell le soin de l’exécuter.

ls | sed -rn "s/^ENLEVER - (.*)\.(.*)/mv '&' 'AJOUTER - \1 - A MOI\.\2'/ p" |sh

Les expressions régulières sont donc des outils géniaux pour manipuler les noms de fichiers. Quelques éléments supplémentaires :

. : désigne n’importe quel caractère.
* : le caractère précédent est présent 0 fois ou plus
+ : le caractère précédent est présent 1 fois ou plus
? : le caractère précédent est optionnel
$ : le caractère est à la fin de la ligne.

Si on veut utiliser ces caractères pour ce qu’ils sont dans une expression, il faut les protéger avec \. \., \* ….

\d : tout caractère numérique, un chiffre en fait !
\D : tout sauf un chiffre, le complémentaire de \d
\w : une lettre en minuscule, en majuscule, accentuée, un chiffre ou _
\W : le complémentaire de \w
\s : tout les caractères non imprimables, saut de ligne, de page, espace…
\S : complémentaire de \s
\b : espace, ponctuation
\B : le complémentaire de \b
\nnn : un caractère en octal

{n,m} : le caractère précédent présent de n à m fois inclus
| : ou donc a|b désignera le caractère a ou b
[  ] : liste de caractère possible, [A-Z] toutes les majuscules, [a-z] les minuscules [A-Za-z] toutes les lettres, mais aussi [FTy+-] un caractère au choix parmi ceux là
[^  ] : le complémentaire du précédent [^A-Z] tout sauf une majuscule

Deux références pour progresser :

Memento expressions régulières

Script Bash[3] – renommer plusieurs fichiers

 

 

 

 

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.