J'essaie actuellement de renommer un grand nombre de fichiers et j'ai utilisé des méthodes assez maladroites pour le faire, telles que :
rename 's:(.*).MOV:$1.mov:g' *.MOV
rename 's:(.*).JPG:$1.jpg:g' *.JPG
Ce que j'aimerais vraiment faire, c'est pouvoir combiner toutes ces commandes en utilisant le 'y' sed
opérateur. Évidemment, en utilisant cet opérateur, vous pouvez transformer des éléments en minuscules. Le problème est que je n'ai besoin de convertir que les extensions. Existe-t-il un moyen de le faire en utilisant cette commande? Je dois essentiellement transformer le groupe de capture dans l'expression suivante en minuscules :^.+.(.+)$
. Y a-t-il un moyen de faire cela? Je suis un peu nouveau dans ce genre de transformations.
Réponse acceptée :
C'est le rename
basé sur Perl trouvé sur Debian, Ubuntu et dérivés, à en juger par la syntaxe. Vous ne pouvez pas utiliser le tr
car il agit sur toute la chaîne. Mais vous pouvez faire correspondre l'extension et la mettre en minuscule avec L
.
rename 's/.[^.]*$/L$&/' *.JPG *.MOV
Ici, ce n'est pas nécessaire, mais si l'expression régulière correspond à plus que la partie que vous souhaitez mettre en minuscules, vous pouvez mettre la partie à faire correspondre dans un groupe :
rename 's/.([^.]*)$/.L$1/' *.JPG *.MOV
Remplacer *.JPG *.MOV
par *.*
pour agir sur tous les fichiers, quelle que soit leur extension. Dans bash ≥4.3 (et aussi dans bash 4.0–4.2, avec la mise en garde que cela traverse également les liens symboliques vers les répertoires), vous pouvez facilement agir sur les fichiers dans les sous-répertoires et ainsi de suite de manière récursive :
rename 's/.[^.]*$/L$&/' **/*.*
Pour les fans de zsh (le :r
et :e
les modificateurs isolent l'extension du reste du fichier) :
autoload zmv
zmv '*.(MOV|JPG)' '${f:r}.${(L)f:e}' # these extensions, current directory
zmv '*.*' '${f:r}.${(L)f:e}' # all extensions, current directory
zmv '**/*.*' '${f:r}.${(L)f:e}' # all extensions, recursive directory traversal