Anleitung: Stapel-Umbenennung von Dateien in Bash
April 17, 2015
Das Umbenennen vieler Dateien auf einmal (Stapel-Umbenennung oder Batch Renaming) ist eine häufige Aufgabe auf der Kommandozeile. Bash bietet hierfür mächtige Werkzeuge, von einfachen for-Schleifen bis hin zu spezialisierten Befehlen wie rename.
Wichtiger Sicherheitshinweis: Führen Sie Umbenennungs-Operationen immer zuerst als "Trockenlauf" (Dry Run) mit echo anstelle von mv oder rename aus, um unbeabsichtigte Änderungen zu vermeiden.
Methode 1: Das rename-Kommando
Viele Linux-Distributionen liefern eine Perl-basierte Version von rename, die reguläre Ausdrücke zur Umbenennung verwendet.
Syntax: rename 's/alt/neu/' dateien
Beispiel: Ersetzen eines Substrings
# Ersetzt 'foo' durch 'bar' in allen Dateinamen
# Zuerst als Trockenlauf mit dem -n Flag (no-op)
rename -n 's/foo/bar/' *.txt
# Wenn das Ergebnis korrekt ist, den Befehl ohne -n ausführen
rename 's/foo/bar/' *.txt
Hinweis: Auf macOS und einigen BSD-Systemen verhält sich
renameanders und unterstützt keine Perl-Expressions. Überprüfen Sie immer dieman rename-Seite Ihres Systems.
Methode 2: for-Schleifen und Parameter-Expansion
Für komplexere oder plattformübergreifende Aufgaben ist die Kombination aus einer for-Schleife und der Bash-Parameter-Expansion eine robuste Lösung.
Präfix hinzufügen
# Fügt allen Dateien das Präfix "backup-" hinzu
for file in *; do
# Trockenlauf: Zeigt den Befehl nur an
echo mv -- "$file" "backup-$file"
# Echter Befehl (auskommentiert)
# mv -- "$file" "backup-$file"
done
Präfix entfernen
Angenommen, die Dateien haben ein Präfix wie 01-, 02-, etc.
# Entfernt den Teil des Strings vom Anfang bis zum ersten '-'
for file in [0-9]*-*; do
echo mv -- "$file" "${file#*-}"
done
${file#*-}: Entfernt das kürzeste passende Muster (*-) vom Anfang des Strings.
Leerzeichen ersetzen
Leerzeichen durch Unterstriche ersetzen:
# Iteriert nur über Dateien, die ein Leerzeichen enthalten
for file in *\ *; do
# ${f// /_}: Ersetzt global (//) alle Leerzeichen durch Unterstriche
echo mv -- "$file" "${file// /_}"
done
Leerzeichen entfernen:
for file in *\ *; do
echo mv -- "$file" "${file// /}"
done
Methode 3: find und xargs (rekursiv)
Um Dateien in Unterverzeichnissen rekursiv umzubenennen, ist find das beste Werkzeug.
Leerzeichen in Dateinamen durch Unterstriche ersetzen
# Sucht alle Dateien (-type f) mit Leerzeichen im Namen und führt rename aus
find . -type f -name "* *" -print0 | xargs -0 rename 's/ /_/g'
-print0undxargs -0: Eine sichere Methode, um Dateinamen mit Sonderzeichen korrekt zu verarbeiten.
Leerzeichen in Verzeichnisnamen durch Unterstriche ersetzen
# Sucht nur nach Verzeichnissen (-type d)
find . -depth -type d -name "* *" -print0 | xargs -0 rename 's/ /_/g'
-depth: Verarbeitet zuerst den Inhalt eines Verzeichnisses, bevor das Verzeichnis selbst umbenannt wird, um Fehler zu vermeiden.
Fazit
Für einfache Ersetzungen ist das rename-Kommando (sofern es die Perl-Variante ist) oft der schnellste Weg. Für maximale Kontrolle, Portabilität und komplexere Logik sind for-Schleifen mit Bash-Parameter-Expansion die robusteste Methode. Für rekursive Operationen ist die Kombination aus find und xargs oder rename unschlagbar.