Notez que vous utilisez le script Perl appelérename
distribué par Debian et ses dérivés (Ubuntu, Mint,…). D'autres distributions Linux embarquent une commande complètement différente et considérablement moins utile appelée rename
.
y/A-Z/a-z/
se traduit chaque caractère dans la plage à A
travers Z
dans le caractère correspondant dans la plage à a
travers z
, soit des lettres majuscules ASCII à la lettre minuscule correspondante. Pour effectuer la traduction opposée, utilisez y/a-z/A-Z/
. Une autre façon d'écrire la même commande est rename '$_ = uc($_)' *
- uc
est la fonction u pper c ase, et la rename
commande renomme les fichiers en fonction de la transformation effectuée dans la $_
variable.
rename '…' *
ne renomme que les fichiers du répertoire courant, car c'est ce qui *
correspond. Les fichiers de points (les fichiers dont le nom commence par .
) sont également ignorés.
Si vous souhaitez renommer les fichiers du répertoire en cours et des sous-répertoires de manière récursive, vous pouvez utiliser la find
commande pour parcourir le répertoire en cours de manière récursive. Il y a une difficulté ici: si vous appelez rename
, cela renomme à la fois le répertoire et la partie nom de base. Si vous appelez rename
un répertoire avant de rentrer dans it ( find -exec rename … {} \;
), cela find
devient confus car il a trouvé un répertoire mais ce répertoire n'existe plus au moment où il essaie d'y descendre. Vous pouvez contourner ce en disant find
à traverser un répertoire avant d' agir là - dessus, mais vous finissez par tenter de renommer foo/bar
pour , FOO/BAR
mais le répertoire FOO
n'existe pas.
Un moyen simple d'éviter cette difficulté est de faire en sorte que la commande de changement de nom n'agisse que sur la partie du nom de base du chemin. L'expression régulière ([^/]*\Z)
correspond à la dernière partie du chemin d'accès qui ne contient pas de /
.
find . -depth -exec rename 's!([^/]*\Z)!uc($1)!e' {} +
Le shell zsh offre des fonctionnalités plus pratiques pour renommer - encore plus cryptique que Perl, mais plus tordu et souvent plus facile à composer.
La fonction zmv
renomme les fichiers en fonction des modèles. Exécutez autoload -U zmv
une fois pour l'activer (mettez cette ligne dans votre .zshrc
).
Dans le premier argument de zmv
(le modèle à remplacer), vous pouvez utiliser les puissants modèles génériques de zsh . Dans le deuxième argument de zmv
(le texte de remplacement), vous pouvez utiliser ses fonctions d' extension de paramètres , y compris les modificateurs d'historique .
zmv -w '**/*' '$1$2:u'
Explication:
-w
- attribuer automatiquement des variables numériques à chaque motif générique
**/*
- tous les fichiers dans les sous-répertoires, récursivement ( **/
correspond à 0, 1 ou plusieurs niveaux de sous-répertoires)
$1
- la première variable numérique, correspondant ici à la partie répertoire de chaque chemin
$2:u
- la deuxième variable numérique, correspondant ici à la partie du nom de base de chaque chemin, avec le :u
modificateur pour convertir la valeur en majuscule
En prime, cela respecte les paramètres de l'environnement local.
Si vous n'êtes pas sûr d'une zmv
commande que vous avez écrite, vous pouvez passer l' -n
option pour imprimer ce que la commande ferait et ne rien changer. Vérifiez la sortie et, si elle fait ce que vous voulez, réexécutez la commande sans -n
réellement agir.
rename 'y/a-z/A-Z/' *
vous obtiendrez ce que vous voulez. Faites attention où vous le testez.