Ich kopiere regelmäßig Dateien auf USB-Sticks oder SD-Karten, die mit FAT32 formatiert sind. Und jedes Mal gibt es Ärger mit Dateinamen, die Zeichen enthalten, die FAT32 nicht erlaubt. Doppelpunkte, Fragezeichen, Sternchen, alles was unter Linux völlig normal ist, wird auf FAT32 zum Problem.

Also habe ich mir ein Bash-Skript geschrieben, das die Arbeit übernimmt. Es durchsucht den aktuellen Ordner, ersetzt alle ungültigen Zeichen und kümmert sich auch um führende oder abschließende Leerzeichen und Punkte. Kollisionen werden vermieden, indem ein Zähler angehängt wird.

Was das Skript macht

Das Skript arbeitet in mehreren Schritten. Zuerst werden alle Dateien im aktuellen Ordner durchlaufen. Für jede Datei wird der Name geprüft und bereinigt.

Die FAT32-verbotenen Zeichen sind der Backslash, der Slash, der Doppelpunkt, das Sternchen, das Fragezeichen, die Anführungszeichen, die spitzen Klammern und die Pipe. Alle diese Zeichen werden durch einen Unterstrich ersetzt.

Zusätzlich werden Steuerzeichen entfernt, also Zeichen mit den Codes 0x00 bis 0x1F. Die tauchen selten auf, aber wenn doch, machen sie Probleme.

Dann werden führende und abschließende Leerzeichen und Punkte entfernt. FAT32 mag das nicht, auch wenn es auf anderen Dateisystemen kein Problem ist.

Wenn der Name danach leer ist, wird ein Notfallname vergeben.

Und schließlich wird geprüft, ob bereits eine Datei mit dem neuen Namen existiert. Falls ja, wird ein Zähler angehängt, um Kollisionen zu vermeiden.

Wie du es verwendest

Speichere das Skript im Ordner, in dem du es verwenden willst unter einem Namen wie z.B. fat32-rename.sh und starte es

bash fat32-rename.sh

Das Skript arbeitet nur im aktuellen Ordner. Unterordner werden nicht durchsucht. Wenn du auch Unterordner bereinigen möchtest, müsstest du es mit find kombinieren oder eine rekursive Variante schreiben.

Was du beachten solltest

Das Skript benennt Dateien um. Wenn du sichergehen möchtest, dass nichts schiefgeht, solltest du vorher ein Backup machen oder zumindest testen, was das Skript tun würde, bevor du es auf wichtige Daten loslässt.

Das Skript überschreibt keine Dateien. Wenn eine Datei mit dem neuen Namen bereits existiert, wird ein Zähler angehängt, sodass der neue Name eindeutig ist.

Das Skript verarbeitet nur Dateien, keine Ordner. Wenn du auch Ordner umbenennen möchtest, müsstest du die Bedingung [ -f "$f" ] entsprechend anpassen.

Fazit

Das Skript hat mir schon viel Zeit gespart. Statt Dateien einzeln umzubenennen, lasse ich es einfach über den Ordner laufen und danach kopiere ich die Dateien auf den FAT32-Datenträger. Das funktioniert zuverlässig und ich muss mir keine Gedanken mehr über ungültige Zeichen machen.

Wenn du häufig mit FAT32 zu tun hast, ist das eine kleine Hilfe, die sich schnell bezahlt macht.

Das Skript

#!/usr/bin/env bash
# Ersetzt FAT32-ungültige Zeichen in Dateinamen im aktuellen Ordner
# Autor: hoergen
# 15.09.2026

for f in *; do
    [ -f "$f" ] || continue

    # FAT32-verbotene Zeichen ersetzen:
    #   \ / : * ? " < > |   ->  _
    # Zusätzlich entfernen: Steuerzeichen (0x00–0x1F) am Anfang/Ende
    new=$(echo "$f" \
        | tr '\\/:*?"<>|' '_________' \
        | tr -d '\000-\037')

    # Führende/abschließende Leerzeichen und Punkte entfernen
    # (FAT32 mag das nicht)
    new=$(echo "$new" | sed -e 's/^[ .]*//' -e 's/[ .]*$//')

    # Leerer Name -> Notfallname
    [ -z "$new" ] && new="unnamed"

    if [ "$f" != "$new" ]; then
        # Kollisionen vermeiden
        if [ -e "$new" ]; then
            base="${new%.*}"
            ext="${new##*.}"
            [ "$base" = "$ext" ] && ext=""
            n=1
            while [ -e "${base}_$n${ext:+.$ext}" ]; do
                n=$((n+1))
            done
            new="${base}_$n${ext:+.$ext}"
        fi
        mv -- "$f" "$new"
        echo "OK  $f -> $new"
    fi
done