Diese Seite wurde am 24.02.2007 überarbeitet.

Mehrere Dateien auf einmal umbenennen

Immer wieder taucht der Wunsch auf, eine Anzahl von Dateien nach einem bestimmten Muster umzubenennen. Ein häufiges Beispiel ist die Änderung der Dateiendung von bestimmten Dateien in einem Verzeichnis. Beispielsweise sollen die Dateiendungen ".htm" in ".html" geändert werden. Wer mit der Arbeitsweise der Shell nicht gut vertraut ist, wird das möglicherweise versuchen, wie im nachfolgenden Beispiel dargestellt.

mv *.htm *.html
Beispiel 1

Dies wird aber fehlschlagen, da zunächst die Sonderzeichenersetzung durchgeführt wird, und dann erst der Befehlsaufruf folgt. Wem nicht klar ist, wie das vor sich geht, dem verschafft folgender Befehlsaufruf vielleicht Klarheit:

echo mv *.htm *.html
Beispiel 2

Für die gewählte Aufgabe gibt es ein Programm namens mmv (multiple move), das aber auf vielen Systemen zumindest standardmäßig nicht verfügbar ist. Deswegen möchte ich auf diesen Ansatz hier auch nicht weiter eingehen.

Die Skript Lösung

Ich stelle hier zunächst eine kompatible Skriptlösung vor. Weiter unten gehe ich dann noch auf ein echtes Killerfeature der Z Shell ein. Mit folgendem Shell Skript können wir viele Dateien auf einmal umbenennen. Aber Achtung: Das Skript demonstriert nur ein Konzept, es verfügt über keinerlei Fehlerkontrolle. Es funktioniert als "quick'n'dirty" Lösung, ich empfehle aber, die Funktion in einer Sandbox zu testen.

#!/bin/sh
# filename: change_ext
#
cd $3
for file in *
do
mv -i $file `echo $file | sed s/$1$/$2/`
done
Beispiel 3

Der Schalter -i sorgt für eine Nachfrage, falls durch die Umbenennung vorhandene Dateien überschrieben werden würden. Wer auf die Frage verzichten möchte, kann den Schalter -i weg lassen.
Aufgerufen wird das Skript folgenermaßen:

change_ext alte Dateiendung neue Dateiendung Verzeichnis
also zum Beispiel:

> change_ext htm html /www/mywebsites/
Beispiel 4

Mit der Z Shell gehts einfacher

Die zsh kommt mit einer großen Zahl an vordefinierten Funktionen und Modulen. Diese können zur Erweiterung des Funktionsumfangs der Shell verwendet werden. Wenn man eine solche Erweiterung verwenden möchte, muss man Sie aber zunächst einmal laden. Uns interessiert hier die Funktion zmv, die wir durch Eingabe von "autoload zmv" in der laufenden Shell laden können.

Nachdem wir dies getan haben, steht uns das Kommando 'zmv' zu Verfügung, mit dem wir die o.g. Aufgabe sehr einfach und effizient ausführen können.


> zmv -W '(*).htm' '*.html'
Beispiel 5

Mit diesem Kommando werden nun alle auf '.htm' endenden Dateien im Arbeitsverzeichnis mit der neuen Endung '.html' versehen.

Die Z Shell kann mehr

'zmv' kann aber noch wesentlich mehr. Um das zu demonstrieren stelle ich zunächst eine alternative Syntax vor, die das selbe Ergebniss erzielt wie das Kommando im Beispiel 5:

> zmv '(*).htm' '$1.html'
Beispiel 6

Bei diesem Aufruf wird der Inhalt der Klammern im alten Muster links in die Variable $1 im neuen Muster rechts eingefügt. Das alte Muster kann aber auch mehrer Klammern enthalten, die dann forlaufend in die Variablen $1, $2 usw. im neuen Muster eingefügt werden.

Angenommen in unserem Verzeichnis befinden sich nicht nur Dateien mit der Endung '.htm' sondern auch solche mit den Endung '.htm.de', 'htm.en', 'htm.es' und einer ganzen Anzahl anderer länderspezifischer Extensions. bei allen Dateien soll der '.htm'-Teil durch ',html' ersetzt werden. Selbst bei einer großen Zahl von Dateien ist das dank 'zmv' mit einem einzigen Befehlsaufruf zu schaffen:


> zmv '(*).htm(*)' '$1.html$2'
Beispiel 7

Bereits an diesen einfachen Beispielen lässt sich die Mächtigkeit von 'zmv' erahnen. Eins von vielen möglichen Anwendungsbeispielen könnte z.B. die stapelweise Umbenennung von Bildateien sein, die ja von den Digitalkameras meist mit recht kryptischen Dateinamen versehen werden.