Supprimer une chaîne de fichiers avec renommer

2

J'ai essayé de renommer par lots un groupe de fichiers afin qu'ils soient cohérents et s'intègrent dans la structure de noms que j'ai proposée. Par exemple, je suis en train de renommer les bandes dessinées et j'ai donc un répertoire qui ressemble à ceci:

$ls *.cbr
Injustice - Gods Among Us 001 (2013) (Digital) (K6 of Ultron-Empire).cbr
Injustice - Gods Among Us 002 (2013) (Digital) (K6 of Ultron-Empire).cbr 
Injustice - Gods Among Us 003 (2013) (Digital) (K6 of Ultron-Empire).cbr

Mon but est d'utiliser renommer les fichiers afin qu'ils ressemblent à ceci:

Injustice - Gods Among Us 001.cbr
Injustice - Gods Among Us 002.cbr
Injustice - Gods Among Us 003.cbr

J'ai donc essayé ce qui suit:

rename -n 's/^\d{3}.\.cbr/^\ $1.cbr/' *.cbr

En supposant qu'en délimitant la première configuration du numéro à 3 chiffres, je pouvais alors changer le nom de manière à tout renommer à partir de la ligne de début (Injustice - Dieu parmi nous) et ajouter le numéro de numéro à 3 chiffres (\ d { 3}) tout se déroulerait. Inutile de dire que ce n'était pas le cas.

Bien que j'aimerais savoir quelque chose sur la façon de résoudre ce problème, je souhaite vraiment mieux comprendre comment tirer parti de l'utilisation de pregex pour une utilisation future.

    
posée K. Callis 30.09.2013 - 02:03
la source

2 réponses

2

Je pense que vous comprenez mal la signification de l'ancre de la ligne carat ( ^ ) - cela ne signifie pas "recherchez un modèle commençant par la regex suivante", cela signifie "recherchez" une ligne commençant par le motif 'suivant - qui ne correspond bien sûr à aucun des noms de fichiers répertoriés, car 001 ... 003 se trouve à mi-chemin du nom.

Ce que vous pensez probablement sont les constructions lookaround de Perl - par exemple, pour limiter votre correspondance à la partie du nom située après la première séquence de 3 chiffres, vous pouvez utiliser un (?<=\d{3}) < em> regarder derrière . De même, pour limiter la correspondance à la partie précédant le suffixe .cbr , vous pouvez utiliser le lookaheaad (?=\.cbr) . Enfin, vous pouvez faire correspondre n'importe quel caractère entre le lookbehind et le lookahead, à savoir .* , et les remplacer par rien:

$ rename -nv 's/(?<=\d{3}).*(?=.cbr)//' *.cbr
Injustice - Gods Among Us 001 (2013) (Digital) (K6 of Ultron-Empire).cbr renamed as Injustice - Gods Among Us 001.cbr
Injustice - Gods Among Us 002 (2013) (Digital) (K6 of Ultron-Empire).cbr renamed as Injustice - Gods Among Us 002.cbr
Injustice - Gods Among Us 003 (2013) (Digital) (K6 of Ultron-Empire).cbr renamed as Injustice - Gods Among Us 003.cbr

Notez qu'il existe généralement différentes manières de faire correspondre et renommer un ensemble particulier de fichiers. Je ne suis pas sûr que ce soit le plus efficace ou le plus robuste, mais j'espère qu'il illustre ce que je pense que vous étiez. tir pour.

    
réponse donnée steeldriver 30.09.2013 - 02:47
la source
1

Je suppose que la chaîne (2013) (Digital) (K6 of Ultron-Empire) est corrigée dans tous les fichiers, vous n'avez donc besoin de rien de trop complexe:

$ ls 
Injustice - Gods Among Us 001 (2013) (Digital) (K6 of Ultron-Empire).cbr
Injustice - Gods Among Us 002 (2013) (Digital) (K6 of Ultron-Empire).cbr
Injustice - Gods Among Us 003 (2013) (Digital) (K6 of Ultron-Empire).cbr
$ rename 's/ \(2013\) \(Digital\) \(K6 of Ultron\-Empire\)//g' *
$ ls
Injustice - Gods Among Us 001.cbr  Injustice - Gods Among Us 003.cbr
Injustice - Gods Among Us 002.cbr

J'ai donné de la flexibilité pour des raisons pratiques. Si vous souhaitez supprimer tous les éléments compris entre (...) , vous pouvez même utiliser les méthodes plus intelligentes :

.
rename -n 's/ ([(].*Digital.*[)])//g' *

De plus, votre expression rationnelle ne sélectionne rien réellement. Je voudrais lire cette réponse pour comprendre le fonctionnement de \d{3} .

    
réponse donnée Braiam 30.09.2013 - 02:35
la source

Lire d'autres questions sur les étiquettes