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
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
.
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
.
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
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!
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.
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.