Admin/Dev

05
Juil.
2021

Plein phare sur une application Brew : rename

Publié par sky

Renommer de multiples fichiers manuellement est une action fastidieuse, dont la pénibilité augmente avec le nombre de fichiers en question. A moins d'une dizaine de fichiers, on ne se pose pas la question, on le fait manuellement et rapidement. A moins d'une centaine, on commence à se poser la question d'une automatisation, dès lors que l'on atteint la centaine, le temps passé à trouver une solution est carrément rentabilisé par l'automatisation du renommage en série.

L'application rename, disponible via Homebrew dans le terminal, permet de renommer des fichiers, ou des dossiers, selon des paramètres que nous lui aurons donné.

Comme d'habitude, regardons ce que nous dit brew sur l'application en question

brew info rename

avec pour résultat

rename: stable 1.601 (bottled), HEAD
Perl-powered file rename script with many helpful built-ins
http://plasmasturm.org/code/rename
Conflicts with:
  util-linux (because both install `rename` binaries)
Not installed
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/rename.rb
==> Dependencies
Build: pod2man ✘
==> Options
--HEAD
    Install HEAD version
==> Analytics
install: 3,110 (30 days), 8,887 (90 days), 37,437 (365 days)
install-on-request: 3,099 (30 days), 8,859 (90 days), 37,006 (365 days)
build-error: 0 (30 days)

Une fois n'est pas coutume, il y a une information plutôt importante dans ce résultat. En effet, nous pouvons voir que l'application est en conflict avec une autre application du même nom, se trouvant dans un paquet nommé util-linux. Ce paquet est contient la plupart des outils présents dans le paquet du même noms pour les systèmes Linux.

Pour avoir installer le paquet précédemment, il semblerait, sans certitude, que les deux applications rename ne sont pas identiques, même si elles ont le même but et le même nom. Elles ne fonctionneront donc pas forcément de la même manière.

Aujourd'hui, nous nous focaliserons sur l'application livrée seule, mais rien ne dit que nous ne prendrons pas le temps de découvrir l'autre dans un futur article.

Commençons par nous déplacer dans le dossier contenant les fichiers que nous souhaitons renommer. Pour cela, nous utilisons, comme d'habitude, la commande cd, vous pouvez ensuite aller dans le dossier en l'écrivant, ou en glissant le dossier dans le terminal.

cd /chemin/vers/mon/dossier/plein/de/fichiers/a/renommer

Ensuite lançons l'application sans paramètres pour voir ce qu'elle nous apprend

rename

voici le résultat

Usage:
    rename [switches|transforms] [files]

    Switches:

    --man (read the full manual)
    -0/--null (when reading from STDIN)
    -f/--force or -i/--interactive (proceed or prompt when overwriting)
    -g/--glob (expand "*" etc. in filenames, useful in Windows™ CMD.EXE)
    -k/--backwards/--reverse-order
    -l/--symlink or -L/--hardlink
    -M/--use=*Module*
    -n/--just-print/--dry-run
    -N/--counter-format
    -p/--mkpath/--make-dirs
    --stdin/--no-stdin
    -t/--sort-time
    -T/--transcode=*encoding*
    -v/--verbose

    Transforms, applied sequentially:

    -a/--append=*str*
    -A/--prepend=*str*
    -c/--lower-case
    -C/--upper-case
    -d/--delete=*str*
    -D/--delete-all=*str*
    -e/--expr=*code*
    -P/--pipe=*cmd*
    -s/--subst *from* *to*
    -S/--subst-all *from* *to*
    -x/--remove-extension
    -X/--keep-extension
    -z/--sanitize
    --camelcase --urlesc --nows --rews --noctrl --nometa --trim (see manual)

Les paramètres sont séparés en 2 catégories, les switches et les transforms. Les switches vont donner ou apporter de l'information, tandis que les transforms vont être les vrais instruments du renommage des fichiers.

Si l'on va principalement s'occuper des transforms, il y a un switch dont nous ne pourrons pas nous passer. Il s'agit du switch -n. En effet, ce paramètre va permettre d'écrire les résultats sans les appliquer. Une bénédiction pour faire de nombreux tests afin de trouver les bons réglages. N'oubliez donc pas d'ajouter ce switch, tant que vous n'êtes pas sûrs de vos commandes.

Maintenant, regardons les transforms, et voyons ce que l'on peut faire avec. Le plus simple est de les regarder dans l'ordre.

Le paramètre -a va ajouter un texte à la fin du nom du fichier ou du dossier. Attention, dans le cas d'un fichier avec extension, l'ajout sera fait après l'extension.

rename -n -a "-Coucou" *

va ajouter le texte "-Coucou" (sans les guillemets) à la fin du nom de tous les éléments du dossier, voici le résultat sur le contenu de mon dossier

'Mon Dossier' would be renamed to 'Mon Dossier-Coucou'
'Mon Dossier2' would be renamed to 'Mon Dossier2-Coucou'
'IMG_1872.jpg' would be renamed to 'IMG_1872.jpg-Coucou'
'IMG_1873.jpg' would be renamed to 'IMG_1873.jpg-Coucou'
'IMG_1874.jpg' would be renamed to 'IMG_1874.jpg-Coucou'
'IMG_1875.jpg' would be renamed to 'IMG_1875.jpg-Coucou'

Vous constatez, qu'avec le switch -n, que l'application indique bien que les changements n'ont pas été fait.

Vous avez remarqué que dans le mode d'emploi de rename, il est indiqué

-a/--append=*str*

C'est tout simplement que l'application permet les deux écritures, nous avons vu la version courte, voici la même commande, avec la version longue

rename -n --append="-Coucou" *

Remarquez la différence, d'un côté, il y a un seul tiret, de l'autre il y en a 2, et il y a un égal avant la valeur. Voici le résultat

'Mon Dossier' would be renamed to 'Mon Dossier-Coucou'
'Mon Dossier2' would be renamed to 'Mon Dossier2-Coucou'
'IMG_1872.jpg' would be renamed to 'IMG_1872.jpg-Coucou'
'IMG_1873.jpg' would be renamed to 'IMG_1873.jpg-Coucou'
'IMG_1874.jpg' would be renamed to 'IMG_1874.jpg-Coucou'
'IMG_1875.jpg' would be renamed to 'IMG_1875.jpg-Coucou'

identique, évidemment. Pour la suite, je n'utiliserai que la version courte, mais sachez que vous pouvez, si vous le préférez, utiliser la longue.

Le paramètre -A va ajouter un texte au début des éléments, tout simplement. Petite subtilité, ici, je ne souhaite ajouter le texte qu'aux fichier JPG.

rename -n -A "Coucou-" *.jpg

le résultat est

'IMG_1872.jpg' would be renamed to 'Coucou-IMG_1872.jpg'
'IMG_1873.jpg' would be renamed to 'Coucou-IMG_1873.jpg'
'IMG_1874.jpg' would be renamed to 'Coucou-IMG_1874.jpg'
'IMG_1875.jpg' would be renamed to 'Coucou-IMG_1875.jpg'

Continuons avec les paramètres -c et -C. Ici, il n'y a pas besoin de rajouter du texte, puisque la commande va simplement mettre toutes les lettres en minuscule, pour -c

rename -n -c *.jpg
'IMG_1872.jpg' would be renamed to 'img_1872.jpg'
'IMG_1873.jpg' would be renamed to 'img_1873.jpg'
'IMG_1874.jpg' would be renamed to 'img_1874.jpg'
'IMG_1875.jpg' would be renamed to 'img_1875.jpg'

ou en majuscule, pour -C.

rename -n -C *.jpg
'IMG_1872.jpg' would be renamed to 'IMG_1872.JPG'
'IMG_1873.jpg' would be renamed to 'IMG_1873.JPG'
'IMG_1874.jpg' would be renamed to 'IMG_1874.JPG'
'IMG_1875.jpg' would be renamed to 'IMG_1875.JPG'

Attention, sur un disque dont la casse pas sensible, vous obtiendrez l'erreur suivante

'IMG_1872.jpg' not renamed: 'IMG_1872.JPG' already exists
'IMG_1873.jpg' not renamed: 'IMG_1873.JPG' already exists
'IMG_1874.jpg' not renamed: 'IMG_1874.JPG' already exists
'IMG_1875.jpg' not renamed: 'IMG_1875.JPG' already exists

Il faudra combiner une autre transformation afin d'être sûr que le nom du fichier n'est pas identique, et que cela fonctionne.

Viennent ensuite les paramètres -d et -D qui permettent de supprimer des éléments. De nous, il faut spécifier le texte à supprimer.

L'option -d va supprimer la première occurence du texte indiqué.

rename -n -d 'IMG' *.jpg
'IMG_1872.jpg' would be renamed to '_1872.jpg'
'IMG_1873.jpg' would be renamed to '_1873.jpg'
'IMG_1874.jpg' would be renamed to '_1874.jpg'
'IMG_1875.jpg' would be renamed to '_1875.jpg'

2 petites choses à noter, premièrement, si l'on avait voulu faire propre, enlever le caractère "_" aurait pu être une bonne idée, sauf si l'on en besoin ensuite. Deuxièmement, le texte cherché est sensible à la casse. Ainsi la commande

rename -n -d 'img' *.jpg

n'aurait retourné aucun résultat. Et sans le switch -n, aucun fichier n'aurait été modifié.

L'option -D va, quant à elle, supprimer toutes les occurrences du texte. Ainsi si l'on avait appliqué la commande

rename -n -D 'ou' *.jpg

sur le résultat de la commande où nous avions ajouté le "Coucou-" en début de nom, nous aurions obtenu

'Coucou-IMG_1872.jpg' would be renamed to 'Cc-IMG_1872.jpg'
'Coucou-IMG_1873.jpg' would be renamed to 'Cc-IMG_1873.jpg'
'Coucou-IMG_1874.jpg' would be renamed to 'Cc-IMG_1874.jpg'
'Coucou-IMG_1875.jpg' would be renamed to 'Cc-IMG_1875.jpg'

Sautons les options -e et -P pour y revenir plus tard. Regardons les options -s et -S, qui permettent de substituer des chaînes de caractères. Si je souhaite à avoir le terme Image en entier, plutot que le raccourci IMG, j'utiliserai la commande suivante

rename -n -s 'IMG' 'Image' *.jpg
'IMG_1872.jpg' would be renamed to 'Image_1872.jpg'
'IMG_1873.jpg' would be renamed to 'Image_1873.jpg'
'IMG_1874.jpg' would be renamed to 'Image_1874.jpg'
'IMG_1875.jpg' would be renamed to 'Image_1875.jpg'

Le paramètre -S permet la même chose, mais réalise tous les changements possibles dans le nom, comme -D le fait par rapport à -d

rename -n -S 'ou' 'oo' *.jpg
'Coucou-IMG_1872.jpg' would be renamed to 'Coocoo-IMG_1872.jpg'
'Coucou-IMG_1873.jpg' would be renamed to 'Coocoo-IMG_1873.jpg'
'Coucou-IMG_1874.jpg' would be renamed to 'Coocoo-IMG_1874.jpg'
'Coucou-IMG_1875.jpg' would be renamed to 'Coocoo-IMG_1875.jpg'

Jetons un oeil aux paramètres liés aux extensions des fichiers. L'option -x est simple, elle enlève simplement l'extension des fichiers

rename -n -x *.jpg
'IMG_1872.jpg' would be renamed to 'IMG_1872'
'IMG_1873.jpg' would be renamed to 'IMG_1873'
'IMG_1874.jpg' would be renamed to 'IMG_1874'
'IMG_1875.jpg' would be renamed to 'IMG_1875'

Seule, l'option -X n'a que peu d'intérêt. Conserver l'extension n'est d'aucune utilité comme seul changement. Mais reprenons notre commande qui ajoute "-Coucou" à la fin du nom des éléments, et ajoutons le -X

rename -n -ax "-Coucou" *

pour voir le résultat

'Mon Dossier' would be renamed to 'Mon Dossier-Coucou'
'Mon Dossier2' would be renamed to 'Mon Dossier2-Coucou'
'IMG_1872.jpg' would be renamed to 'IMG_1872-Coucou.jpg'
'IMG_1873.jpg' would be renamed to 'IMG_1873-Coucou.jpg'
'IMG_1874.jpg' would be renamed to 'IMG_1874-Coucou.jpg'
'IMG_1875.jpg' would be renamed to 'IMG_1875-Coucou.jpg'

Comme nous pouvons le voir, cela ne change rien pour les dossiers, par contre, les fichiers sont enfin renommés "correctement", puisqu'en général, on souhaite conserver l'extension des fichiers.

Evidemment, il est possible de faire d'autres combinaisons pour en voir le résultat. A vous de jouer, et n'hésitez pas à faire vos propres expérimentations.

Dernière option simple à regarder, il s'agit du paramètre -z. Ce paramètre peut devenir pratique car il retire tous les espaces et caractères de ponctuation pour les transformer en underscore

rename -n -z *

avec le résultat

'Mon Dossier' would be renamed to 'Mon_Dossier'
'Mon Dossier2' would be renamed to 'Mon_Dossier2'

Cela permet de transformer les noms de fichiers pour qu'ils soient plus facile d'accès dans le terminal. Cette transformation aurait pu être vraiment pratique, si les développeurs étaient allés au bout. En effet, développé par des anglo-saxons, ils n'ont pas penser à ajouter le nettoyage des caractères accentués. Pour des éléments n'en disposant pas, comme dans mon exemple, cela reste une très bonne option.

Nous venons de faire le tour de toutes les options de transformation simples. L'option -e permet de passer des expressions régulières permettant d'effectuer des transformations. Aussi complexe qu'elle puisse paraitre, il s'agit en fait de l'option la plus simple. En effet, il suffit de regarder le code source de l'application pour voir que toutes autres transformations sont des expressions régulières pré-formatées selon les besoins pour faciliter l'utilisation de la commande. L'option -e est la seule dont le texte passé en  paramètre est exécuté directement. D'ailleurs si vous omettez le -e, votre expression régulière sera tout de même prise en compte.

Evidemment, à utiliser, ce n'est pas forcément la plus simple, car il faut connaitre les expressions régulières pour pouvoir s'en servir. Cependant, il n'y a aucune limite car on peut vraiment aller très loin dans les modifications.

Pour commencer simplement, reproduisons le comportement du paramètres -s

rename -n -e "s/IMG/Image/" *

Pour le paramètres -S, ce n'est pas bien plus compliqué

rename -n -e "s/IMG/Image/g" *

On rajoute simplement le modifieur g à l'expression régulière pour que la recherche soit globale, dans toute la chaîne de caractères.

L'outil utilise les mêmes expressions régulières que l'outil sed pour éditer des fichiers. Si vous en avez un peu l'expérience, rename deviendra l'outil parfait pour renommer vos fichiers en série.

Voici l'une des expressions que j'utilise le plus souvent, il s'agit d'une fonction qui va avoir le même effet que l'option -z, en un peu plus pratique, à mon goût.

rename -nXe "s/([^A-Za-z0-9]+)/-/g" *

Précisément, cela va remplacer tous les caractères qui ne sont pas des lettres ou des nombres, par des tirets. Cependant, elle va un peu plus loin, car lorsqu'il n'y a plusieurs caractères non souhaités d'affilé, elle va les remplacer par un seul caractère de tiret. Si vous préférez les underscores, il suffit de la modifier telle que

rename -nXe "s/([^A-Za-z0-9]+)/_/g" *

Pour finir, il ne reste que l'option -P qui permet de passer une commande en paramètre, cependant, je cherche encore comment elle fonctionne afin de transmettre à la commande le nom courant du fichier en paramètre. Je mettrai à jour l'article, dès que j'aurais la solution. Si vous l'avez, les commentaires sont évidemment disponibles.

N'oubliez pas de retirer le paramètre -n afin sortir de vos phases de test, et d'exécuter réellement les renommages.

 
Sommaire de la série
 
 
Commentaires
Aucun commentaire pour le moment.

 

Poster un commentaire
En postant sur skymac.org, je m'engage à être courtois et à ce que mon message soit pertinent avec le sujet de l'article.
En outre, j'accepte, sans condition, que mon message soit refusé et supprimé si ces règles ne sont pas appliquées.
Ouvrir le panneau de gestion des cookies
Fermer le panneau
Ce site utilise des cookies pour assurer son bon fonctionnement. Il utilise aussi des cookies issues de services tiers permettant de proposer des fonctionnalités avancées. À tout moment, vous pouvez choisir quels services vous souhaitez activer ou refuser, afin de retirer votre consentement quant à l'utilisation des cookies.
 
Personnalisation des services
Vous êtes libre de choisir quels services vous souhaitez activer. En autorisant ces services tiers, vous acceptez le dépôt et la lecture de cookies et l'utilisation de technologies de suivi nécessaires à leur bon fonctionnement. En retirant votre consentement pour certains de ces services, certaines fonctionnalités du site peuvent ne plus fonctionner.
Navigation du site  En savoir plus
Le site écrit un cookie de session permettant son bon fonctionnement et aidant à la navigation. Il ne peut être désactivé.
Utilisation : 1 cookie, enregistre l'identifiant de la session.
Durée de vie : Le cookie est présent pendant toute la session sur le site. Il devient obsolète après 24 minutes d'inactivité.
Obligatoire
Popup Média
Afficher des vidéos depuis Yoube ou Dailymotion.
 
Tout accepter Tout refuser Gérer