Mehrere Dateien umbenennen mit rename

Problem

In einem Verzeichnis sollen mehrere Dateien umbenannt werden. Typischer Fall sind gerippte CD, bei denen die Dateinamen eigentlich nie so sind, wie man es gerne hätte. Schon eine gewöhliches Hörbuch mit sechs CD ergibt mehr als 100 mp3-Dateien. Mit manueller Bearbeitung der Dateinamen kommt man da nicht weiter. Diese Art der Umbennung erfordert eine gewisse Automation und legt die Verwendung regulärer Ausdrücke nahe.

Ursache

Manchmal passiert es, dass Dateien unpraktisch benannt sind.

Lösung

Das Programm rename ermöglicht komplexe Umbenennungen vonm Dateien unter Verwendung von regulären Ausdrücken.

Vorsicht! Reguläre Ausdrücke geraten schnell recht unübersichtlich. Ist man sich hinsichtlich der Wirkung nicht so recht sicher, sollte man renaME grundsätzlich erst einmal mit dem Argument -n ausführen, der die Änderungen an den Dateinamen nur anzeigt, aber nicht umsetrzt.

Neu Durchnummerieren

Eine Grupe von Dateien enthält beispielsweise eine durchlaufende Nummerierung mit einer Zahl bestehend aus zwei Ziffern. Die Zahl soll in allen Dateien um 10 erhöht werden. Gleichzeitig soll das Format von zwei Ziffern auf drei Ziffern mit führenden Nullen umgestellt werden.

rename 's/([0-9][0-9])/sprintf("%03d",$1+10)/e' *

Das Beispiel ist allerdings in dieser Form tückisch (ich bringe es in deser Form auch nur deswegen, weil ich mehrfach diese Fehler begangen habe). Das Suchmuster in eine Zahl mit zwei Ziffern, die Ausgabe erfolgt jedoch mit drei Ziffern. Wendet man diesen Befehl zweimal hintereinander an, gibt es Kleinholz, weil beim zweiten Mal nur die ersten beiden Ziffern verwendet werden, die dritte jedoch ignoriert wird. Das ergibt eine unbrauchjbare vierziffrige Zahl. Beim zweiten Mal müsste man daher unbedingt folgendes setzen (was man garantiert irgendwann vergessen wird)

rename 's([0-9][0-0][0-9])/sprintf("%03d", $1+10)/e' *

Besser man verwendet gleich eine Form, die von der exakten Zahl der Ziffern unabhängig ist. Das Pluszeichen im regulären Ausdruck erfordert mindest eine Ziffer:

rename 's([0-9]+)/sprintf("%03d", $1+10)/e' *

Noch zwei Fallstricke:

  1. Beinhaltet der umzuwandelnde Dateiname mehrere, voneinander unabhängige Zahlen schlägt die Addition natürlich bei allen Zahlen zu, sofern sie bzgl. der Ziffernzahl matchen. In diesem Fall muss man das Suchmuster geeignet mit angrenzenden Zeichen erweitern, damit auch wirklich nur die gewünschte Zahl verändert wird.
  2. Überlappen sich die Zahlenbereiche der alten und der neuen Nummerierung, gibt es ebenfalls Chaos. In diesem Fall ist es empfehlenswert zunächst eine weitaus größere Zahl zu addieren, z.B. 110 oder 1010. In einem zweiten Schritt zieht man etwas ab, etwa 100 oder 1000, und hat letztlich eine Addition von 10 bewirkt.