Linux – Dateinamen und/oder Verzeichnisse in Groß- oder Kleinschreibung umbenennen

Es gibt ein Kommandozeilen-Tool das Groß- oder Kleinschreibung wie auch in bestimmte Zeichensätze umbenennen bzw. konvertieren kann. Das Tool heißt convmv.

Unter openSUSE 11.x lässt sich das Tool sehr einfach in der Konsole installieren:

zypper in convmv

Wenn man alle Dateien und Verzeichnisse im aktuellen Verzeichnis in Kleinschreibung haben möchte, dann reicht dieser Befehl:

convmv --lower *

Wenn man aber alles in Großschreibung haben möchte, dann nimmt man die Option –upper anstatt –lower. Zur Vereinfachung bleibe ich in diesem kleinen HowTo bei der Kleinschreibung und gehe auf verschiedene Lösungswege ein.

Jedoch wird hier eine Liste mit den Änderungen ausgegeben. Somit kann man wunderbar verfolgen, wie das Tool bei der Umbenennung vorgeht.

Um die Umbenennung auch wirklich auszuführen, gibt man noch die Option –notest an:

convmv --lower --notest *

Wenn das Tool rekursiv durch alle Unterverzeichnisse arbeiten soll, dann fügen wir noch eine Option -r ein:

convmv -r --lower --notest *

Jetzt kommen wir mal zu einem Spezialfall. Wenn wir aber nur Dateinamen rekursiv durch alle Unterverzeichnisse umbenennen möchten, dann hilft uns in diesem Fall weitere Tools wie find und xargs:

find ./ -type f -print0 | xargs -r -0 convmv --lower

Erläuterung für find:
./ = In welchem Verzeichnis soll durchsucht werden (hier nur aktuelles)
-type f = Nur Dateien sollen berücksichtigt werden
-print0 = Jede Datei wird ein NULL-Zeichen als Trennzeichen angehängt, somit lassen sich die Dateiennamen bei der Übergabe an xargs besser auseinander halten

Erläuterung für xargs:
-r = nicht ausführen, wenn keine weiteren Argumente übergeben werden können (= leer)
-0 = NULL-Zeichen als Trennzeichen berücksichtigen.

Was ist mit dem schwierigsten Fall wie z.B. die Umbenennung von Verzeichnisnamen und das auch noch rekursiv durch alle Unterverzeichnisse? Nun man denkt einfach, dass man den o.g. Befehl -type f in -type d austauschen und ausführen kann. Spätestens bei der Umbenennung eines Unterverzeichnis dessen oberen Verzeichnisname sich geändert hat, würde das Vorhaben nur auf eine einzige Verzeichnistiefe beschränken. Alle darunterliegenden Verzeichnisse können somit nicht umbenannt werden.

Also verwenden wir ein etwas modifizierten Einzeiler und geben dem find die Option -depth mit, somit sollten die Verzeichnisse in korrekter Reihenfolge an convmv übergeben werden:

find ./ -depth -type d -print0 | xargs -r -0 convmv --lower --notest

Hinweis zum Tool find und der Option -exec:
Einige Linux-User verwenden statt xargs eher die Option -exec in find. Wobei ich vom Gebrauch der Option -exec expizit abraten würde. Ich verdeutliche es mal an einem Beispiel. Wenn find z.B. 5.000 Dateien findet, werden bei -exec auch 5.000 Prozesse hintereinander gestartet und das geht zu Lasten der System-Performance. Bei der Verwendung von xargs werden 5.000 Dateien als Argumente an das jeweilige Programm übergeben und benötigt nur 1 Prozess anstatt 5.000 Prozesse. ;-)