Jeder, der mit Linux arbeitet, kennt das Problem: Dateien und Ordner mit Leerzeichen, Umlauten oder Sonderzeichen im Namen. Das kann nicht nur in Skripten oder bei der Verarbeitung mit anderen Programmen zu Fehlern führen, sondern macht das Arbeiten im Terminal auch unnötig kompliziert. In diesem Beitrag zeige ich dir, wie du mit einem einzigen Shellscript alle diese Probleme behebst – rekursiv und automatisch!
Warum sollte man Dateinamen bereinigen?
Ordner- und Dateinamen mit Sonderzeichen, Leerzeichen oder Umlauten verursachen in vielen Situationen Probleme, etwa bei:
- Verwendung in Skripten oder Programmen
- Datenübertragungen auf andere Systeme (z.B. Windows zu Linux)
- Backup- und Sync-Prozessen
- Versionierung mit Git
Ein einheitliches und sauberes Dateisystem ist übersichtlicher und vermeidet viele Fehlerquellen.
Das Shellscript im Detail
Mit folgendem Bash-Script werden rekursiv in allen Unterordnern Dateien und Ordner gefunden, deren Namen unerwünschte Zeichen enthalten. Anschließend werden diese Zeichen durch Unterstriche ersetzt. Besonders berücksichtigt werden:
#!/bin/bash ROOT="${1:-.}" function clean_name() { local name="$1" # Umlaute und ß ersetzen name="${name//ä/ae}" name="${name//ö/oe}" name="${name//ü/ue}" name="${name//Ä/Ae}" name="${name//Ö/Oe}" name="${name//Ü/Ue}" name="${name//ß/ss}" # Alle Zeichen außer Buchstaben, Zahlen und Unterstrich ersetzen name=$(echo "$name" | sed 's/[^A-Za-z0-9_]/_/g') # Mehrere Unterstriche zusammenfassen name=$(echo "$name" | sed 's/__*/_/g') echo "$name" } export -f clean_name find "$ROOT" -depth | while IFS= read -r OLD; do DIR=$(dirname "$OLD") BASE=$(basename "$OLD") NEWBASE=$(clean_name "$BASE") if [[ "$BASE" != "$NEWBASE" ]]; then NEW="$DIR/$NEWBASE" if [[ ! -e "$NEW" ]]; then mv "$OLD" "$NEW" echo "Renamed: $OLD → $NEW" else echo "WARNUNG: $NEW existiert schon, $OLD wurde nicht umbenannt!" fi fi done
Anwendung des Scripts
Speichern: Kopiere das Script in eine Datei, z.B. rename_recursive.sh und mache es ausführbar:
chmod +x rename_recursive.sh
ausführen:
Für das aktuelle Verzeichnis:
./rename_recursive.sh
Oder für ein bestimmtes Verzeichnis:
./rename_recursive.sh /pfad/zum/ordner
Das Script geht alle Unterverzeichnisse durch und ersetzt problematische Zeichen zuverlässig.
Beispiele
Vorher:
- Fall 2. 24,11
- Mein-Ordner mit Ä und Ö!
- Projekt, Version 1.2
Nachher:
- Fall_2_24_11
- Mein_Ordner_mit_Ae_und_Oe_
- Projekt_Version_1_2
FAQ
Wie sicher ist das Script?
Das Script prüft vor dem Umbenennen, ob der neue Name bereits existiert. Trotzdem empfiehlt sich ein Backup vor der ersten Anwendung!
Werden auch Dateinamen geändert?
Ja, sowohl Dateien als auch Ordner werden angepasst.
Kann ich das Script anpassen?
Natürlich! Du kannst die Zeichen im clean_name-Bereich beliebig ergänzen oder Ausnahmen hinzufügen.
Darf ich Punkte oder bestimmte Zeichen behalten?
Dann passe die Zeile
s/[^A-Za-z0-9_]/_/g
zum Beispiel zu
s/[^A-Za-z0-9_.]/_/g
an (behalte den Punkt).