2012-08-04 5 views
21

Ich habe eine Reihe von Dateien mit dem Namen wie:Dateien mit regulären Ausdrücken in Linux

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 

und ich möchte, dass sie benennen, wie die folgende

S06E03.srt 
S06E20.srt 
S06E05.srt 

was soll ich den Job tun, um fertig in Linux-Terminal? Ich habe Umbenennungs installiert, aber U Fehler erhalten die mit folgenden:

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

Antwort

35

Sie einen Punkt vor dem Sternchen vergessen:

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

Auf OpenSUSE, RedHat, Gentoo Sie Perl verwenden Version rename. This answer zeigt, wie man es bekommt. In Arch heißt das Paket perl-rename.

+2

OpenSUSE, RedHat, Gentoo unterstützt Regex nicht in 'rename' – mmrmartin

+0

@mmrmartin: Das hier verwendete Umbenennungsskript ist das von Larry Wall geschriebene Skript. Es wurde in der Datei '/ usr/bin/rename' verwendet, aber vielleicht wurde es umbenannt (kein Wortspiel beabsichtigt)? Unter Debian lautet der Skriptname nun "/ usr/bin/file-rename". – Thor

+1

openSUSE verwendet Umbenennen von 'util-linux' Paket, ich habe kein Paket gefunden, das' file-rename', 'prename' oder' perl-rename' anbietet - einzige funktionierende Lösung war [install mit cpan] (http: // stackoverflow.com/a/32862278/1392034) für mich. – mmrmartin

7

Nicht jede Distribution liefert ein rename-Dienstprogramm, das Regexe wie in den obigen Beispielen verwendet - RedHat, Gentoo und ihre Derivate unter anderem.

Alternativen zu versuchen zu verwenden sind perl-rename und mmv.

0

können Sie rnm verwenden:

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

Erläuterung:

  1. -rs: ersetzen String der Form /search_regex/replace_part/modifier
  2. (\d) und (\d+) in (\d)x(\d+) sind zwei gefangen groupes (\1 und \2 respectively) .

Weitere Beispiele here.

4

Edit: fand einen besseren Weg, um die Dateien aufzulisten, ohne IFS und ls mit, während immer noch sh konform zu sein.

würde ich ein Shell-Skript für das tun:

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

zurück Skript:

#!/bin/sh 
IFS=' 
' 
for file in `ls -1 *.srt`; do 
    newname=`echo "$file" | sed 's/^.*\([0-9]\+\)x\([0-9]\+\).*$/S0\1E\2.srt/'` 
    mv "$file" "$newname" 
done 
+0

Wofür steht 'IFS = '\ n'' in diesem Beispiel? Ich mag es, weil es nichts besonderes verwendet. – Szobi

+0

IFS: Der interne Feldtrenner, der nach der Erweiterung für die Wortaufteilung verwendet wird und Zeilen mit dem Befehl read builtin in Wörter aufteilt. Der Standardwert ist "" - (von man bash). Wenn Sie es in '\ n' ändern, können Sie eine Datei pro Zeile abrufen. – Creak

0

wenn Ihr Linux bietet nicht umbenennen, können Sie auch die folgenden:

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

Ich benutze diesen Ausschnitt sehr oft, um Substitutionen mit Regex in meiner Konsole durchzuführen.

ich bin nicht sehr gut in der Schale-Sachen, aber so weit ich diesen Code zu verstehen, würde seine Erklärung wie: die Suchergebnisse Ihrer findet wird auf einen bash-Befehl übergeben werden (bash - c) wo Ihr Suchergebnis innerhalb von $ 1 als Quelldatei sein wird. das Ziel, das ist das Ergebnis einer Substitution innerhalb einer Subshell folgt, wobei der Gehalt an $ 1 (hier: nur in Ihrer Parameter-substituion { // Suchen/Ersetzen}) wird auch Ihre Suchergebnis. die {} leitet sie an den Inhalt von -execdir

bessere Erklärungen viel würde geschätzt :)

Bitte beachten Sie: i nur Ihre regex Kopie kleistert; Bitte testen Sie es zuerst mit Beispieldateien. abhängig von Ihrem System müssen Sie möglicherweise \ d und \ w in Zeichenklassen wie [[: digit:]] oder [[: alpha:]] ändern. \ 1 sollte jedoch für die Gruppen funktionieren.

1

mmv ist einfach, aber nützlich. Es verwendet * für eine beliebige Zeichenfolge und ? für ein beliebiges Zeichen in der Übereinstimmungszeichenfolge und #X in der Ersetzungszeichenfolge, um auf die X-te Übereinstimmung zu verweisen.

In Ihrem Fall:

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

Hier #1#2 stellen die beiden Ziffern, die durch ?? (Match # 1 und # 2) erfasst werden.

mmv auch passende Angebote mit [ und ] und ;, lesen Sie die man-Seite für mehr!

1

Wirklich cool lil diddy.

xargs -n2 ermöglicht es, zwei Argumente pro Zeile zu drucken. In Kombination mit Perls print $_ (um zuerst das $ STDIN zu drucken), macht es ein mächtiges Umbenennungswerkzeug.

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

Ergebnisse perl -pe 'print $_; s/OldName/NewName/' | xargs -n2 Am Ende wird:

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

Ich habe auf meinem System rename leicht nicht in Perl zur Verfügung.