Découvrez l’outil de renommage de fichiers incontournable dans le monde Linux, une alternative qui simplifie la vie et épargne l’usage fréquent de mv
. Renommer devient une opération à la fois flexible, rapide et souvent bien plus aisée. Voici un guide pour maîtriser cette commande centrale.
Pourquoi mv
n’est pas toujours idéal ?
Il n’y a rien de fondamentalement mauvais avec mv
. Cette commande accomplit son travail efficacement et est présente sur toutes les distributions Linux, macOS et autres systèmes d’exploitation de type Unix. Elle reste donc toujours accessible. Cependant, il y a des moments où un outil plus spécifique est nécessaire.
La fonction principale de mv
est de déplacer des fichiers. Son usage pour renommer un fichier en le déplaçant vers un nouveau fichier portant le nom souhaité est un dérivé pratique. Bien que cela permette de renommer des fichiers, mv
n’est pas un outil conçu spécifiquement pour cette tâche.
Renommer un fichier unique avec mv
Pour renommer un fichier avec mv
, saisissez mv
, un espace, le nom actuel du fichier, un espace, et le nouveau nom que vous souhaitez lui donner. Validez avec la touche Entrée.
Vous pouvez utiliser ls
pour confirmer que le fichier a bien été renommé.
mv ancien_fichier.txt nouveau_fichier.txt
ls *.txt
Renommer plusieurs fichiers avec mv
La situation se complique lorsqu’il faut renommer plusieurs fichiers. mv
n’est pas conçu pour traiter plusieurs fichiers simultanément. Il est alors nécessaire d’utiliser des techniques complexes de Bash. Cela peut être une solution pour les habitués de la ligne de commande, mais la complexité de renommer plusieurs fichiers avec mv
contraste avec la simplicité relative de renommer un seul fichier.
Les manipulations peuvent rapidement devenir fastidieuses.
Imaginons un répertoire avec divers fichiers, chacun avec une extension différente, certains portant l’extension «.prog». Nous voulons renommer ces fichiers en ligne de commande pour qu’ils aient une extension «.prg».
Comment utiliser mv
pour cela ? Examinons d’abord les fichiers.
ls *.prog -l
Voici une approche sans recourir à un script Bash :
for f in *.prog; do mv -- "$f" "${f%.prog}.prg"; done
Le changement a-t-il fonctionné ? Vérifions les fichiers.
ls *.pr*
Effectivement, la manipulation a réussi. Tous les fichiers ont l’extension «.prg», et il n’y a plus de fichiers avec l’extension «.prog» dans ce répertoire.
Que s’est-il passé exactement ?
Analysons plus en détail cette commande complexe.
for f in *.prog; do mv -- "$f" "${f%.prog}.prg"; done
La première partie met en place une boucle qui examine chaque fichier portant l’extension «.prog» dans le répertoire, l’un après l’autre.
La partie suivante spécifie l’opération à réaliser. Elle utilise mv
pour déplacer chaque fichier vers un nouveau fichier. Ce nouveau fichier est renommé en conservant le nom original du fichier, en supprimant l’extension «.prog» et en la remplaçant par l’extension «.prg».
Existe-t-il une manière plus simple ?
Absolument. Il s’agit de la commande rename
.
rename
n’est pas incluse dans toutes les distributions Linux par défaut, il est donc nécessaire de l’installer. Son nom peut varier selon la distribution, mais son fonctionnement reste identique. Il suffira d’ajuster le nom de la commande selon la distribution Linux utilisée.
Pour les distributions dérivées d’Ubuntu et de Debian, rename
s’installe ainsi :
sudo apt-get install rename
Pour les distributions dérivées de Fedora et RedHat, il faut installer prename
. Le «p» indique qu’il s’agit d’une commande Perl.
sudo dnf install prename
Pour Manjaro Linux, la commande à utiliser est la suivante. On note que la commande de renommage s’appelle perl-rename
.
sudo pacman -Syu perl-rename
Réessayons
Cette fois, nous allons utiliser rename
. Remettons les fichiers avec l’extension «.prog».
ls *.prog
Utilisons la commande suivante pour les renommer. Puis, vérifions avec ls
si la manipulation a réussi. N’oubliez pas de remplacer rename
par le nom de commande approprié à votre distribution si vous n’utilisez pas Ubuntu ou une distribution dérivée de Debian.
rename 's/\.prog/\.prg/' *.prog
ls *.pr*
L’opération est un succès, tous les fichiers ont désormais l’extension «.prg», et il n’y a plus de fichiers portant l’extension «.prog» dans le répertoire.
Que s’est-il passé cette fois-ci ?
Décortiquons cette instruction magique en trois segments.
Le premier segment est le nom de la commande : rename
(ou prename
ou perl-rename
selon les distributions).
Le dernier segment est *.prog
, qui indique à rename
d’appliquer l’opération sur tous les fichiers avec l’extension «.prog».
Le segment central spécifie l’action à exécuter sur chaque nom de fichier. Le s
signifie substitution. Le premier terme (.prog
) est ce que rename
recherche dans chaque nom de fichier, et le second terme (.prg
) est ce par quoi il sera remplacé.
La partie centrale de la commande, ou expression centrale, est une expression régulière Perl, qui confère à la commande rename
toute sa flexibilité.
Modifier d’autres parties d’un nom de fichier
Jusqu’ici, nous avons modifié les extensions de noms de fichiers. Modifions d’autres parties de ces noms.
Le répertoire contient plusieurs fichiers de code source C. Tous les noms de fichiers ont pour préfixe «slang_». On peut vérifier cela avec ls
.
ls sl*.c
Nous allons remplacer toutes les occurrences de «slang_» par «sl_». Le format de la commande nous est déjà familier. Il suffit de modifier le terme recherché, le terme de remplacement, et le type de fichier.
rename 's/slang_/sl_/' *.c
Ici, nous ciblons les fichiers «.c» et recherchons «slang_». Chaque fois que «slang_» est détecté dans un nom de fichier, il est remplacé par «sl_».
Nous pouvons vérifier l’effet de cette commande en répétant la commande ls
ci-dessus avec les mêmes arguments :
ls sl*.c
Supprimer une partie d’un nom de fichier
Il est possible de supprimer une partie d’un nom de fichier en remplaçant le terme recherché par une chaîne vide.
ls *.c
rename 's/sl_//' *.c
ls *.c
On peut voir grâce à la commande ls
que nos fichiers «.c» ont tous un préfixe «sl_». Débarrassons-nous de ce préfixe.
La commande rename
respecte le même format que précédemment. Nous allons cibler les fichiers «.c». Le terme à rechercher est «sl_», mais il n’y a aucun terme de substitution. Deux barres obliques sans rien entre elles signifient une chaîne vide.
rename
va traiter chaque fichier «.c» à son tour. Il va rechercher «sl_» dans le nom du fichier. Si cette chaîne est détectée, elle sera remplacée par rien, c’est-à-dire qu’elle sera supprimée.
La seconde utilisation de la commande ls
confirme que le préfixe «sl_» a bien été supprimé de chaque fichier «.c».
Limiter les modifications à des parties spécifiques des noms de fichiers
Utilisons ls
pour examiner les fichiers dont le nom contient la chaîne «param». Nous utiliserons ensuite rename
pour remplacer cette chaîne par «parameter». Enfin, nous utiliserons de nouveau ls
pour observer le résultat de la commande rename
sur ces fichiers.
ls *param*
rename 's/param/parameter/' *.c
ls *param*
Quatre fichiers ont été détectés avec «param» dans leur nom. param.c
, param_one.c
et param_two.c
ont tous «param» en début de nom. third_param.c
a «param» à la fin de son nom, juste avant l’extension.
La commande rename
va rechercher «param» partout dans le nom du fichier, et le remplacer par «parameter» dans tous les cas.
La deuxième utilisation de la commande ls
nous montre que c’est précisément ce qui s’est produit. Que «param» soit au début ou à la fin du nom de fichier, il a été remplacé par «parameter».
Nous pouvons utiliser les métacaractères de Perl pour affiner le comportement de l’expression du milieu. Les métacaractères sont des symboles qui représentent des positions ou des séquences de caractères. Par exemple, ^
signifie «début d’une chaîne», $
signifie «fin d’une chaîne», et .
signifie n’importe quel caractère unique (à l’exception d’un saut de ligne).
Utilisons le métacaractère de début de chaîne (^) pour limiter notre recherche au début des noms de fichiers.
ls *param*.c
rename 's/^parameter/value/' *.c
ls *param*.c
ls value*.c
Les fichiers que nous avons renommés précédemment sont listés, et on peut voir que la chaîne «parameter» se trouve en début de trois noms de fichiers et à la fin d’un des noms de fichiers.
Notre commande rename
utilise le métacaractère de début de ligne (^) avant le terme de recherche «parameter». Cela indique à rename
de considérer le terme de recherche uniquement s’il se trouve au début du nom de fichier. La chaîne «parameter» sera ignorée si elle se trouve ailleurs dans le nom de fichier.
En vérifiant avec ls
, on peut voir que le nom de fichier qui avait «parameter» à la fin n’a pas été modifié. En revanche, les trois noms de fichiers qui avaient «parameter» en début de nom ont vu cette chaîne remplacée par le terme de substitution «value».
La puissance de rename
réside dans la puissance de Perl. La puissance de Perl est mise à votre disposition.
Rechercher avec des regroupements
rename
a d’autres atouts dans sa manche. Examinons le cas où vous auriez des fichiers avec des chaînes similaires dans leurs noms. Il ne s’agit pas exactement des mêmes chaînes, donc une simple recherche et substitution ne fonctionnerait pas.
Dans cet exemple, nous utilisons ls
pour identifier les fichiers qui commencent par «str». Il y en a deux, string.c
et strangle.c
. Nous pouvons renommer les deux chaînes en une seule fois en utilisant une technique appelée le regroupement.
L’expression centrale de cette commande rename
recherchera les chaînes dans les noms de fichiers qui ont la séquence de caractères «stri» ou «stra», et qui sont suivies immédiatement de «ng». Autrement dit, notre terme de recherche va cibler à la fois «string» et «strang». Le terme de substitution est «bang».
ls str*.c
rename 's/(stri|stra)ng/bang/' *.c
ls ban*.c
L’utilisation de ls
une seconde fois confirme que string.c
est devenu bang.c
et strangle.c
est maintenant bangle.c
.
Utiliser les traductions avec rename
La commande rename
peut exécuter des opérations sur les noms de fichiers appelées traductions. Une traduction simple consisterait à forcer l’ensemble des noms de fichiers en majuscules.
Dans la commande rename
ci-dessous, on remarque que nous n’utilisons pas s/
pour initier l’expression centrale, mais y/
. Ceci indique à rename
que nous n’effectuons pas une substitution, mais une traduction.
Le terme az
est une expression Perl qui signifie tous les caractères minuscules de la séquence de a
à z
. De même, le terme AZ
représente toutes les lettres majuscules de la séquence de A
à Z
.
L’expression centrale de cette commande peut être paraphrasée ainsi : «si l’une des lettres minuscules de a
à z
se trouve dans le nom de fichier, remplacez-la par les caractères correspondants dans la séquence de lettres majuscules de A
à Z
».
Pour forcer les noms de tous les fichiers «.prg» en majuscules, utilisez la commande suivante :
rename 'y/az/AZ/' *.prg
ls *.PRG
La commande ls
nous montre que tous les noms de fichiers «.prg» sont maintenant en majuscules. En fait, pour être précis, ce ne sont plus des fichiers «.prg». Ce sont des fichiers «.PRG». Linux est sensible à la casse.
Nous pouvons inverser cette commande en inversant la position des termes az
et AZ
dans l’expression centrale.
rename 'y/AZ/az/' *.PRG
ls *.prg
On n’apprend pas Perl en cinq minutes
Se familiariser avec Perl est un investissement de temps profitable. Toutefois, pour commencer à exploiter les capacités de gain de temps de la commande rename
, il n’est pas indispensable d’avoir des connaissances approfondies de Perl pour tirer parti de sa puissance, de sa simplicité et de ses avantages en termes de temps.