Renommer des fichiers
Pour renommer des fichiers numérotés avec espaces de la forme mon fichier 01.txt
en 01-mon fichier 01.txt
, on peut utiliser sed
et mv
de la manière suivante :
IFS=$'\n' for SOURCE in *; do TARGET=$(echo $SOURCE| sed -e 's/\(.*\([0-9][0-9]\).*\)/\2-\1/') mv $SOURCE $TARGET done IFS=$' \t\n'
Il faut noter que l'utilisation de sed
dans cette configuration est gourmande. Si on essaye de renommer mon fichier 01 - 55.txt
, on aura le fichier 55-mon fichier 01 - 55.txt
au lieu de 01-mon fichier 01 - 55.txt
. Dans ce cas, il faudra utiliser la commande suivante :
IFS=$'\n' for SOURCE in *; do TARGET=$(echo $SOURCE| sed -e 's/\([^0-9]*\([0-9][0-9]\).*\)/\2-\1/') mv $SOURCE $TARGET done IFS=$' \t\n'
Il existe aussi un script Perl qui permet de faire cela à l'aide d'expressions régulières. Il est installé par défaut sur certaines distributions (ex : Ubuntu) mais pas sur d'autres (ex : Archlinux). On peut l'utiliser de la manière suivante :
# Renommer "fichier1" et "fichier2" en "fichier1.bak" et "fichier2.bak" rename 's/$/.bak/' fichier{1,2} # Renommer "fichier 1" et "fichier 2" en "fichier1.bak" et "fichier2.bak" rename 's/ ([1,2])$/$1.bak/' fichier\ {1,2} # Renommer "premier gros fichier" en "premier.Gros.Fichier" rename 's/ (.)/.\u$1/g' premier\ gros\ fichier # Renommer "exemple d'un gros fichier" en "exemple.D.Un.Gros.Fichier" rename 's/[ '"'"'](.)/.\u$1/g' exemple\ d\'un\ gros\ fichier # Renommer "fichier1" et "fichier2" en "FICHIER1" et "FICHIER2" rename 's/(.)/\u$1/g' fichier{1,2} rename 'y/a-z/A-Z/' fichier{1,2} # Renommer "FICHIER1" et "FICHIER2" en "fichier1" et "fichier2" rename 's/(.)/\l$1/g' FICHIER{1,2} rename 'y/A-Z/a-z/' FICHIER{1,2}
Sur Ubuntu, les commandes sont utilisables directement. Sur Archlinux, il faut préfixer toutes les commandes par perl-
. Par exemple :
perl-rename 's/$/.bak/' fichier{1,2} # au lieu de rename 's/$/.bak/' fichier{1,2}