1 votes

Renommer par lots un texte spécifique dans le nom d'un dossier

Existe-t-il un moyen de changer la capitalisation du texte pour les dossiers, mais de laisser le texte entre parenthèses inchangé ? Y a-t-il un moyen possible de faire cela avec pyRenamer ?

Par exemple, si les dossiers sont nommés :

dogs bark - cats miaow [DBCM001]
james peach - jack beanstalk [JPJB521]
small pond - big fish (revive) [FIN07CD]

Changer pour :

Dogs Bark - Cats Miaow [DBCM001]
James Peach - Jack Beanstalk [JPJB521]
Small Pond - Big Fish (revive) [FIN07CD]

Toutes les formulations entre parenthèses sont incohérentes. Il y a plus de 1000 dossiers à renommer !

Comment pourrais-je faire ça ?

2voto

Stewart Points 1385

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]

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X