TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸

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

code
# 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 rename anders und unterstützt keine Perl-Expressions. Überprüfen Sie immer die man 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

code
# 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.

code
# 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:

code
# 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:

code
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

code
# Sucht alle Dateien (-type f) mit Leerzeichen im Namen und führt rename aus
find . -type f -name "* *" -print0 | xargs -0 rename 's/ /_/g'
  • -print0 und xargs -0: Eine sichere Methode, um Dateinamen mit Sonderzeichen korrekt zu verarbeiten.

Leerzeichen in Verzeichnisnamen durch Unterstriche ersetzen

code
# 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.