Ich versuche derzeit, eine große Menge von Dateien umzubenennen, und habe dazu ziemlich klobige Methoden verwendet, wie zum Beispiel:
rename 's:(.*).MOV:$1.mov:g' *.MOV
rename 's:(.*).JPG:$1.jpg:g' *.JPG
Was ich wirklich gerne tun würde, ist in der Lage zu sein, all diese Befehle mit dem 'y' sed
zu kombinieren Operator. Offensichtlich können Sie mit diesem Operator Elemente in Kleinbuchstaben umwandeln. Das Problem ist, dass ich nur die Erweiterungen umwandeln muss. Gibt es eine Möglichkeit, dies mit diesem Befehl zu tun? Ich muss die Erfassungsgruppe im folgenden Ausdruck im Wesentlichen in Kleinbuchstaben umwandeln:^.+.(.+)$
. Gibt es eine Möglichkeit, dies zu tun? Ich bin ziemlich neu in dieser Art von Transformationen.
Akzeptierte Antwort:
Das ist das Perl-basierte rename
gefunden auf Debian, Ubuntu und Derivaten, nach der Syntax zu urteilen. Sie können den tr
nicht verwenden -Operator, da er auf die gesamte Zeichenfolge wirkt. Aber Sie können die Erweiterung abgleichen und sie mit L
klein schreiben .
rename 's/.[^.]*$/L$&/' *.JPG *.MOV
Hier ist es unnötig, aber wenn der reguläre Ausdruck mehr als der Teil entspricht, den Sie in Kleinbuchstaben schreiben möchten, können Sie den zu vergleichenden Teil in eine Gruppe einfügen:
rename 's/.([^.]*)$/.L$1/' *.JPG *.MOV
Ersetzen Sie *.JPG *.MOV
durch *.*
um auf alle Dateien unabhängig von der Erweiterung zu reagieren. In bash ≥4.3 (und auch in bash 4.0–4.2, mit der Einschränkung, dass dies auch symbolische Links zu Verzeichnissen durchläuft) können Sie problemlos rekursiv auf Dateien in Unterverzeichnissen usw. reagieren:
rename 's/.[^.]*$/L$&/' **/*.*
Für die zsh-Fans (die :r
und :e
Modifikatoren isolieren die Erweiterung vom Rest der Datei):
autoload zmv
zmv '*.(MOV|JPG)' '${f:r}.${(L)f:e}' # these extensions, current directory
zmv '*.*' '${f:r}.${(L)f:e}' # all extensions, current directory
zmv '**/*.*' '${f:r}.${(L)f:e}' # all extensions, recursive directory traversal