Renommer les fichiers en utilisant l'expression régulière sous linux

j'ai une série de fichiers nommés comme:

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 le suivant

S06E03.srt
S06E20.srt
S06E05.srt

que dois-je faire pour que le travail soit fait dans un terminal linux? J'ai installé le renommer, mais U y a des erreurs à l'aide de la commande suivante:

rename -n 's/(w+) - (d{1})x(d{2})*$/S0E.srt/' *.srt
29
demandé sur Thor 2012-08-04 19:13:29

7 réponses

vous avez oublié un point devant l'astérisque:

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

sur OpenSUSE, RedHat, Gentoo vous devez utiliser la version Perl de rename. Cette réponse montre comment l'obtenir. Sur Arch, le paquet s'appelle perl-rename.

46
répondu Thor 2017-12-27 15:25:30

Pas chaque distro navires rename utilitaire qui supporte les regexes tels qu'ils sont utilisés dans les exemples ci - dessus-RedHat, Gentoo et leurs dérivés entre autres.

les Alternatives à essayer sont perl-rename et mmv.

7
répondu gerrit_hoekstra 2015-05-18 11:17:01

Edit: j'ai trouvé une meilleure façon de lister les fichiers sans utiliser IFS et ls tout en encore sh conforme.

je voudrais faire un script shell pour que:

#!/bin/sh
for file in *.srt; do
  if [ -e "$file" ]; then
    newname=`echo "$file" | sed 's/^.*\([0-9]\+\)x\([0-9]\+\).*$/S0E.srt/'`
    mv "$file" "$newname"
  fi
done

script précédent:

#!/bin/sh
IFS='
'
for file in `ls -1 *.srt`; do
  newname=`echo "$file" | sed 's/^.*\([0-9]\+\)x\([0-9]\+\).*$/S0E.srt/'`
  mv "$file" "$newname"
done
5
répondu Creak 2018-03-07 23:30:48

Utiliser mmv (mouvement de masse?)

C'est simple mais utile:* pour n'importe quelle chaîne et ? pour n'importe quel caractère de la chaîne de correspondance et #X dans la chaîne replace pour renvoyer à la correspondance X-th.

dans votre cas:

mmv 'Friends - 6x?? - Tow *.srt' 'S06E#1#2.srt'

Ici #1#2 représentent les deux chiffres qui sont capturés par ?? (match #1 et #2).

Ainsi, le remplacement suivant est fait:

Friends - 6x?? - Tow *           .srt    matches
Friends - 6x03 - Tow Ross' Denial.srt    which is replaced by
            ↓↓
        S06E03.srt

mmv offre également correspondance par [ et ] et ;.

Vous pouvez non seulement renommer, mais aussi déplacer, copier, ajouter et lien fichiers.

Lire la page de manuel liée ci-dessus pour en savoir plus!

3
répondu xoxox 2018-06-22 05:28:25

si votre linux n'offre pas de renommer, vous pouvez également utiliser la syntaxe suivante:

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

j'utilise cet extrait assez souvent pour effectuer des substitutions avec regex dans ma console.

Je ne suis pas très bon en shell-stuff, mais pour autant que je comprenne ce code, son explication serait comme: les résultats de recherche de votre trouver sera transmise à un bash-commande ( bash-c) où votre résultat de recherche sera à 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-puits, où le contenu de 1$ (ici:1 dans votre paramètre-substitution 1//trouver/remplacer}) sera aussi votre résultat de recherche. {} le transmet au contenu de - execdir

meilleures explications serait beaucoup apprécié :)

veuillez noter: je ne copie-collé votre regex; veuillez d'abord tester avec des fichiers d'exemple. selon votre système, vous devrez modifier \d et \w pour les classes de caractères, comme [[:digit:]] ou [[:alpha:]]. cependant, \1 devrait fonctionner pour les groupes.

1
répondu meistermuh 2017-10-09 14:07:53

Vraiment cool lil diddy.

xargs -n2 permet d'imprimer deux arguments par ligne. Lorsque combiné avec Perl's print $_ (pour imprimer le $STDIN d'abord), il fait pour un outil de renommage puissant.

find . -type f | perl -pe 'print $_; s/input/output/' | xargs -n2 mv

résultats de perl -pe 'print $_; s/OldName/NewName/' | xargs -n2 fin:

OldName.ext    NewName.ext
OldName.ext    NewName.ext
OldName.ext    NewName.ext
OldName.ext    NewName.ext

je n'ai pas eu de Perl rename disponible sur mon système.

1
répondu Jonathan Komar 2018-07-25 07:59:41

Vous pouvez utiliser rvm:

rnm -rs '/\w+\s*-\s*(\d)x(\d+).*$/S0E.srt/' *.srt

Explication:

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

Plus d'exemples ici.

0
répondu Jahid 2016-05-07 08:43:06