Linux-Script: Ordner und Dateien rekursiv umbenennen

von | 15 Juli,2025 | Scripts & Snippets

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).