83 votes

Renommer des fichiers à l'aide d'expressions régulières sous Linux

J'ai un ensemble de fichiers nommés comme suit :

Friends - 6x03 - Tow Ross' Denial.srt
Friends - 6x20 - Tow Mac and C.H.E.E.S.E..srt
Friends - 6x05 - Tow Joey's Porshe.srt

et je veux les renommer comme suit

S06E03.srt
S06E20.srt
S06E05.srt

que dois-je faire pour que le travail soit fait dans le terminal linux ? J'ai installé rename mais j'obtiens des erreurs en utilisant ce qui suit :

rename -n 's/(\w+) - (\d{1})x(\d{2})*$/S0$2E$3\.srt/' *.srt

6voto

meistermuh Points 291

Si votre système linux n'offre pas renommer Vous pouvez également utiliser la méthode suivante :

find . -type f -name "Friends*" -execdir bash -c 'mv "$1" "${1/\w+\s*-\s*(\d)x(\d+).*$/S0\1E\2.srt}"' _ {} \;

J'utilise ce snippet assez souvent pour effectuer des substitutions avec des regex dans ma console.

Je ne suis pas très doué en shell, mais pour autant que je comprenne ce code, son explication serait la suivante : les résultats de la recherche de votre trouver sera transmise à une commande bash ( bash -c ) où le résultat de votre recherche se trouvera à l'intérieur de $1 comme fichier source. la cible qui suit est le résultat d'une substitution à l'intérieur d'un sous-shell, où le contenu de $1 (ici : juste 1 à l'intérieur de votre substitution de paramètres { 1 //find/replace} ) sera également le résultat de votre recherche. {} le transmet au contenu de -execdir

de meilleures explications seraient appréciées :)

Remarque : je n'ai fait que copier-coller votre expression rationnelle ; veuillez la tester d'abord avec des fichiers d'exemple. selon votre système, vous devrez peut-être modifier les éléments suivants \d y \w à des classes de caractères telles que [[:digit :]] ou [[:alpha :]], \1 devrait fonctionner pour les groupes.

4voto

alisson_Soares Points 59

Je pense que la méthode la plus simple et la plus universelle consiste à utiliser for loop sed y mv . Tout d'abord, vous pouvez vérifier vos substitutions d'expressions rationnelles dans un tube :

ls *.srt | sed -E 's/.* ([0-9])x([0-9]{2}) .*(\.srt)/S\1E\2\3/g'

S'il imprime la bonne substitution, il suffit de la mettre dans un for loop con mv

for i in $(ls *.srt); do 
    mv $i $(echo $i | sed -E 's/.* ([0-9])x([0-9]{2}) .*(\.srt)/S\1E\2\3/g') 
    done

2voto

Jahid Points 12756

Vous pouvez utiliser rnm :

rnm -rs '/\w+\s*-\s*(\d)x(\d+).*$/S0\1E\2.srt/' *.srt

Explication :

  1. -rs : chaîne de remplacement de la forme /search_regex/replace_part/modifier
  2. (\d) et (\d+) en (\d)x(\d+) sont deux groupes capturés ( \1 y \2 respectivement).

Plus d'exemples aquí .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X