Vous pouvez le faire avec rename
:
$ rename -n 's/(?<![([])(\b\w)/uc($1)/eg' */
dogs bark - cats miaow [DBCM001]/ -> Dogs Bark - Cats Miaow [DBCM001]/
james peach - jack beanstalk [JPJB521]/ -> James Peach - Jack Beanstalk [JPJB521]/
small pond - big fish (revive) [FIN07CD]/ -> Small Pond - Big Fish (revive) [FIN07CD]/
En -n
fait rename
imprimer ce qu'il ferait sans faire quoi que ce soit. Supprimez le -n
une fois que vous êtes sûr qu'il fonctionne comme vous le souhaitez.
En s/from/to/
est l'opérateur de substitution et remplacera from
mit to
. Ici, je le donne :
-
(?<![([])
: cela s'appelle un regard négatif en arrière . Le format général est le suivant (?<!foo)
et cela signifie "ignorer toute correspondance si le mot précédent est foo
". Ici, je lui donne le paternel [([]
il s'agit d'une classe de caractères (définie par [ ]
) composé de tho caractères : [
y (
. Le tout signifie donc "ignorer toutes les correspondances qui viennent juste après une [
ou un (
.
-
(\b\w)
: le \b
correspond à un "limite du mot" . Il s'agit d'une ancre de longueur 0 qui correspond au point de transition entre un mot et un non-mot. Ainsi, par exemple, elle correspond au début de la ligne, à un espace ou à tout autre caractère non verbal. Le site \w
en revanche, correspond à un caractère de mot. Donc, \b\w
correspond à la 1ère lettre d'un mot. Les parenthèses qui l'entourent le "capturent" de sorte que nous pouvons y faire référence en tant que $1
du côté droit de l'opérateur de substitution.
-
uc($1)
: c'est ce par quoi nous remplaçons ce que nous avons apparié. Comme expliqué ci-dessus, puisque la correspondance est entre parenthèses, nous pouvons maintenant y faire référence en tant que $1
. uc()
est une fonction Perl qui rend les choses en MAJUSCULES. Cela signifie donc simplement "imprimer la correspondance en majuscules".
-
eg
: ce sont des interrupteurs qui affectent le comportement de s///
. Plus précisément, le e
permet d'exécuter des commandes dans la partie droite, ce qui nous permet d'utiliser uc()
y el g
applique la substitution de manière globale, à toutes les correspondances sur la ligne.
Enfin, */
signifie "exécuter la commande sur tous les répertoires du répertoire courant".
Si vous souhaitez également mettre en majuscules les mots entre parenthèses, vous pouvez utiliser ceci à la place :
$ rename -n 's/(?<!\[)(\b\w)/uc($1)/eg' */
dogs bark - cats miaow [DBCM001] -> Dogs Bark - Cats Miaow [DBCM001]
james peach - jack beanstalk [JPJB521] -> James Peach - Jack Beanstalk [JPJB521]
small pond - big fish (revive) [FIN07CD] -> Small Pond - Big Fish (Revive) [FIN07CD]