move.sh

Introduction

Origine du script

Vous disposez d'une grande quantité de fichiers nommés de la même façon et vous souhaitez tous les renommer à partir de leur nom d'origine. Par exemple l'objectif peut être de mettre leur nom complètement en minuscules ou d'enlever une partie de leur nom qui est commun à tous les fichiers. La solution proposée ici utilise les expressions rationnelles (regexp, regular expression) pour traiter les noms de fichiers. La commande sedUsage: sed [OPTION]... {script-seulement-si-pas-d'autre-script}
[fichier-d'entrée]...
(Stream EDitor) permet de manipuler les chaînes de caractères à l'aide de telles expressions.

Note de compatibilité

Comme je travaille sous OpenBSD, je préfère préciser que ce script est probablement compatible avec tous les UNIX pas trop exotiques. En effet, il n'utilise pas de commandes spécifiques GNU/Linux comme seq qui permet de sortir une séquence de nombres et qui est souvent utilisé avec les boucles for (NdM : la commande seqUsage: seq [OPTION]... DERNIER
ou: seq [OPTION]... PERMIER DERNIER
ou: seq [OPTION]... PREMIER INCRÉMENT DERNIER
Afficher les nombres du PREMIER jusqu'au DERNIER,
selon le PAS d'incrémentation.
fait partie du package GNU shellutils). Du coup, le code est parfois un peu tiré par les cheveux. Cela dit, rien ne vous empêche de modifier un peu le code pour en simplifier la structure.

Par contre je ne garantis pas que certaines structures comme l'utilisation de parenthèses au lieu de crochets dans les tests des structures conditionnelles ne pose pas quelques problèmes sous GNU/Linux (Je n'ai pas de machine sous la main pour m'en assurer).

Le shell utilisé pour ce script est tout simplement sh.

Mise en oeuvre du script

Pour tester ce script, il vous faut simplement un éditeur de texte comme vi/vim, emacs ou encore nano pour écrire les commandes dans un fichier .sh. Une fois le fichier créé, il suffit de le rendre exécutable à l'aide de la commande chmodUsage: chmod [OPTION]... MODE[,MODE]... FICHIER...
ou: chmod [OPTION]... MODE-OCTAL FICHIER
ou: chmod [OPTION]... --reference=FICHIER-R FICHIER
Changer le mode de chaque fichier selon le MODE choisi.
. Ainsi, pour rendre exécutable le fichier de script downloader.sh, vous taperez la commande chmod +x move.shUsage: chmod [OPTION]... MODE[,MODE]... FICHIER...
ou: chmod [OPTION]... MODE-OCTAL FICHIER
ou: chmod [OPTION]... --reference=FICHIER-R FICHIER
Changer le mode de chaque fichier selon le MODE choisi.
.

Retirer une partie commune du nom

Le script travaille sur tous les fichiers présent dans le dossier dans lequel il se trouve (En particulier, le script va tenter de se renommer lui-même, ce qui n'aboutira pas et ne gênera pas son exécution). Pour ce faire, nous utilisons la commande lsUsage: ls [OPTION]... [FICHIER]...
Afficher les informations au sujet des FICHIERS (du répertoire
courant par défaut). Trier les entrées alphabétiquement si aucune
des options -cftuSUX ou --sort n'est utilisée.
que nous redirigeons à sedUsage: sed [OPTION]... {script-seulement-si-pas-d'autre-script}
[fichier-d'entrée]...
par pipe. L'expression rationnelle permet de faire une substitution (l'argument de la commande est de la forme s/foo/bar/g pour remplacer foo par bar). Dans ce même argument, l'utilisation de parenthèses permet d'isoler la partie du nom du fichier que l'on souhaite conserver (notez l'échappement des parenthèses avec l'antislashe).

Au final, la commande sedUsage: sed [OPTION]... {script-seulement-si-pas-d'autre-script}
[fichier-d'entrée]...
renvoie la liste des parties de noms de fichiers isolée à l'aide de l'expression rationnelle. Il reste alors à utiliser cette liste dans la boucle for pour automatiser le renommage à l'aide de la commande mvUsage: mv [OPTION]... [-T] SOURCE CIBLE
ou: mv [OPTION]... SOURCE... RÉPERTOIRE
ou: mv [OPTION]... --target-directory=RÉPERTOIRE SOURCE...
Renommer la SOURCE à la DESTINATION ou déplacer la SOURCE vers la DESTINATION.
. A chaque itération de la boucle, la variable $code contient la partie du nom de fichier que l'on a isolée.

L'exemple de script donné ci-dessous est codé en dur pour le cas d'utilisation suivant : nous avons une série de fichiers tous nommés de la façon un_mot-flag.png et nous souhaitons les renommer en un_mot.png. Pour cela, nous isolons donc la partie en gras à l'aide de l'expression rationnelle : un_mot-flag.png.

#!/bin/sh

for code in $(ls | sed -e "s/\([a-z][a-z]\)-flag.png/\1/g")
do
  mv $code-flag.png $code.png
done
		

Changer la casse d'une partie du nom

Cette version du script utilise le même principe que le précédent. Nous rajoutons simplement une seconde commande sedUsage: sed [OPTION]... {script-seulement-si-pas-d'autre-script}
[fichier-d'entrée]...
qui permet de passer le texte en majuscules. Le script commence donc par isoler le nom de fichier sans l'extension, puis passe ce nom en majuscules et renomme le fichier à l'aide de ce nom em majuscules.

#!/bin/sh

for code in $(ls | sed -e "s/\([a-z][a-z]\).png/\1/g")
do
  for newcode in $(echo $code | sed "y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/")
  do
    mv $code.png $newcode.png
  done
done
		

Documentation sous licence GNU/Free Documentation Licence version 1.2
http://www.gnu.org/copyleft/fdl.html
Christophe Eyquem