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}