Renommer plusieurs fichiers simultanément sous Linux et Windows en ligne de commande

Je viens de recevoir des fichiers html réalisés par mon graphiste et je dois les intégrer en php.
La première chose à faire, avant de lancer le codage, est de changer l’extension html des fichiers par php.
S’il y a moins de 10 fichiers, faire le changement à la main est rapide. Mais s’il y a plus de 10 fichiers (en l’occurrence 50) à modifier, un petit script va faire l’affaire :

Sous Windows

Nous allons utiliser l’invite de commande et la commande MsDos ren :

Invite cmd

cd path/to/the/directory/contining/the/files
REM echo > index.html && echo > index2.html && echo > index3.html && echo > index4.html # ligne facultative
dir
ren *.html *.php
dir

Sous Linux

Nous allons utiliser le shell et la commande rename :

Shell

cd path/to/the/directory/contining/the/files
# touch index.html index2.html index3.html index4.html # ligne facultative
ls -l
rename 's/\.html$/\.php/' *.html
ls -l

La syntaxe sous Linux est plus compliquée que sous Windows…


Comment fonctionne la commande rename ?

remane perlexpr [files]

Après quelques recherches sur le net, et mes connaissances en Regex PHP, voilà ce qu’il faut déduire :

  • perlexpr : il s’agit d’une expression régulière perl. Elle a la forme suivante s/expr1/expr2/[gi] :
    • s : lance le regex en perl pour réaliser une Subtitution
    • / : séparateur
    • expr1 : il faut remplacer .html se trouvant obligatoirement à la fin du nom de fichier : \.html$
    • / : séparateur
    • expr2 : par .php (\.php)
    • / : séparation de motif
    • [gi] cette option non utilisée ici
  • files : la liste des fichiers sur laquelle la commande rename doit intervenir *.html (ce qui est aussi un REGEX 🙂 )

La commande rename se lit donc dans l’ordre inverse :

rename 's/\.html$/\.php/' *.html
  1. pour tous les fichiers finissant par .html (le deuxième argument donné : *.html)
  2. tu vas effectuer une substitution en appliquant la règle décrite dans perlexpr : remplacer .html obligatoirement à la fin de la chaine de caractère par .php (le premier argument : ‘s/\.html$/\.php/’)

Autres idées sur le sujet :

  • Mettre en minuscule les extensions pour les fichiers images
  • mettre les dimensions des images dans le nom du fichier
  • Réaliser un rename de manière recursive
  • Remplacer les espaces par des tirets
  • Remplacer les caractères accentués par des caractères non accentuées
  • Réaliser rename avec find et mv