Kopieren scheitert an Dateinamen: verbotene Zeichen und Kollisionen
Ein Ordner lässt sich nicht kopieren: Ein Name enthält ein verbotenes Zeichen, oder zwei Namen unterscheiden sich nur in der Schreibweise.
Aufwand:
ca. 30 Min.
Voraussetzung:
Zugriff auf die Quellseite (Linux, NAS oder Mac), Administrator-Rechte für den letzten Schritt
Gilt für:
Kopieren von Linux oder NAS nach Windows, Abgleich mit Wolkenspeichern, Entpacken von Archiven aus fremder Quelle
Das Symptom
Ein Ordner soll vom NAS auf den Windows-Rechner, in den Wolkenspeicher oder auf
einen Stick. Der Kopiervorgang läuft ein Stück weit und bleibt dann an einer
einzelnen Datei hängen: Der Name enthalte unzulässige Zeichen, heißt es, oder das
Ziel sei nicht verfügbar. In der freundlicheren Variante meldet gar nichts einen
Fehler – nur liegen hinterher weniger Dateien im Zielordner als in der Quelle,
und es fällt erst Wochen später auf.
Die „Layer 8“-Wahrheit
Ein Dateiname ist keine Zeichenkette, sondern eine Zeichenkette plus die Regeln
des Systems, auf dem sie liegt. Diese Regeln sind unterschiedlich, und das eine
System weiß nichts von den Beschränkungen des anderen. Linux verbietet in einem
Namen praktisch nur den Schrägstrich. Windows verbietet neun Sonderzeichen,
sämtliche Steuerzeichen, das abschließende Leerzeichen, den abschließenden Punkt
und obendrein eine Handvoll Wörter, die seit MS-DOS Geräte bezeichnen: CON, PRN,
AUX, NUL, COM1 bis COM9, LPT1 bis LPT9 – auch mit Endung, denn NUL.txt bleibt
NUL. Wer auf einem Linux-Server einen Ordner Angebot 3:2 gewonnen anlegt, tut
nichts Verbotenes. Er legt nur etwas an, das auf der anderen Seite nicht
existieren darf.
Die zweite Hälfte ist die unangenehmere, weil sie ohne Fehlermeldung auskommt.
Linux behandelt Bericht.txt und bericht.txt als zwei Dateien, Windows
behandelt sie als eine. Microsofts eigene Anleitung sagt Entwicklern deshalb
seit jeher, sie sollten keine Unterscheidung nach Schreibweise annehmen und
OSCAR, Oscar und oscar für denselben Namen halten. Landen beide Dateien im selben
Windows-Ordner, gewinnt die zuletzt kopierte, und die andere ist weg – ohne
Nachfrage, ohne Papierkorb, ohne Protokoll. Selbst wenn beide es irgendwie in
denselben Ordner schaffen, zeigt der Explorer sie zwar an, öffnet aber immer
dieselbe. Windows kann die Unterscheidung inzwischen je Verzeichnis
einschalten – das repariert aber nur das Dateisystem, nicht die Programme, die
Jahrzehnte darauf gebaut haben, dass es sie nicht braucht. Die belastbare Lösung
ist deshalb unromantisch: vor dem Kopieren nachsehen, umbenennen, dann kopieren.
In dieser Reihenfolge, denn nach dem Kopieren gibt es nichts mehr umzubenennen.
Die echte, verifizierte Lösung
1000 % faktenbasiert. Jeder Befehl ist real, jeder Pfad existiert. Schritt für Schritt:
1.
Namen mit verbotenen Zeichen auf der Quellseite finden
Gesucht wird auf dem System, das die Namen erlaubt hat – also auf dem Linux-Rechner, dem NAS oder dem Mac, bevor kopiert wird. Der Befehl listet die Dateinamen und filtert alles heraus, was Windows ablehnt, einschließlich der Namen, die mit Leerzeichen oder Punkt enden:
Die zweite Klasse von Namen, an denen ein Kopiervorgang scheitert, sieht völlig unauffällig aus. Der Filter prüft die Namen unabhängig von der Schreibweise und berücksichtigt, dass eine Endung nichts an der Reservierung ändert:
find . -type f -printf '%f\n' | grep -Ei '^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\.|$)'
3.
Namen finden, die sich nur in der Schreibweise unterscheiden
Das ist der gefährlichere Fall, weil er nicht mit einer Fehlermeldung endet, sondern mit stillem Datenverlust. Der Lauf gruppiert alle Pfade nach ihrer kleingeschriebenen Fassung und zeigt jede Gruppe, die mehr als einen Eintrag hat – das sind genau die Dateien, die sich auf der Windows-Seite gegenseitig überschreiben würden:
find . -type f | awk '{k=tolower($0); n[k]++; l[k]=l[k] $0 " "} END {for (i in n) if (n[i]>1) print l[i]}'
4.
Auf der Seite umbenennen, die es zulässt
Repariert wird immer dort, wo beide Namen noch existieren, also auf der Quellseite. Erst umbenennen, dann kopieren – nie umgekehrt. Wer zuerst kopiert und dann aufräumt, räumt unter Umständen die einzige verbliebene Fassung weg, weil die andere beim Kopieren bereits überschrieben wurde.
mv './Bericht.txt' './Bericht-alt.txt'
5.
Erst danach kopieren und das Ergebnis zählen
Nach der Umbenennung wird kopiert und anschließend geprüft, ob auf beiden Seiten gleich viele Dateien liegen. Eine Zahl, die nicht stimmt, ist der einzige Hinweis, den man auf still verschluckte Dateien bekommt:
find . -type f | wc -l
6.
Nur im Notfall: das Zielverzeichnis unterscheidungsfähig machen
Windows kann Groß- und Kleinschreibung je Verzeichnis unterscheiden. Das ist die letzte Wahl, nicht die erste: Microsoft warnt ausdrücklich, dass Programme, die von der Unterscheidungslosigkeit ausgehen, Dateien in solchen Verzeichnissen nicht mehr erreichen, weil sie Namen gern in Groß- oder Kleinbuchstaben umschreiben. Außerdem muss das Verzeichnis leer sein, damit sich das Kennzeichen setzen lässt. Beide Befehle brauchen eine als Administrator gestartete Eingabeaufforderung:
?Welche Zeichen sind in einem Windows-Dateinamen eigentlich verboten?
Microsoft führt sie in den Namenskonventionen abschließend auf: kleiner als, größer als, Doppelpunkt, doppeltes Anführungszeichen, Schrägstrich, umgekehrter Schrägstrich, senkrechter Strich, Fragezeichen und Sternchen. Dazu der Wert null sowie alle Zeichen mit den Codes 1 bis 31. Außerdem darf ein Datei- oder Verzeichnisname nicht mit einem Leerzeichen oder einem Punkt enden – das zugrunde liegende Dateisystem könnte es zwar, die Windows-Oberfläche jedoch nicht. Ein Punkt am Anfang ist dagegen ausdrücklich erlaubt. Auf Linux sind von dieser Liste nur der Schrägstrich und das Nullbyte verboten, weshalb ein Name wie Angebot 3:2 gewonnen.txt dort völlig unauffällig entsteht und beim Kopieren auf Windows die Kopie zerreißt.
?Warum bricht der Kopiervorgang bei einer Datei ab, die ganz harmlos heißt?
Dann steckt vermutlich ein reservierter Gerätename dahinter. Windows behandelt CON, PRN, AUX, NUL, COM1 bis COM9 und LPT1 bis LPT9 in jedem Verzeichnis als Gerät, nicht als Datei – und laut Dokumentation gilt das auch, wenn eine Endung folgt: NUL.txt und NUL.tar.gz sind beide gleichbedeutend mit NUL. Eine Datei con.log aus einem Linux-Projekt oder ein Ordner aux aus einem alten Archiv reicht also, um eine Kopie an genau dieser Stelle scheitern zu lassen, ohne dass am Namen etwas Verdächtiges zu sehen wäre.
?Ich sehe zwei Dateien, aber es öffnet sich immer dieselbe. Bin ich verrückt?
Nein, das ist dokumentiertes Verhalten. Das Windows-Dateisystem behandelt Namen ohne Rücksicht auf Groß- und Kleinschreibung, Linux nicht: Dort sind FOO.txt und foo.txt zwei verschiedene Dateien. Für ein Verzeichnis ohne das ausdrücklich gesetzte Kennzeichen beschreibt Microsoft die Folge wörtlich: Der Datei-Explorer zeigt beide Dateien an, aber nur eine wird sich öffnen lassen, gleichgültig welche du auswählst. Windows-Programme setzen die Unterscheidungslosigkeit voraus und können zwei Namen, die sich nur in der Schreibweise unterscheiden, nicht auseinanderhalten. Kopiert man solche Dateien in ein gewöhnliches Windows-Verzeichnis, überschreibt die eine still die andere.
Belege
Diese Seite ist gegen die folgenden Primärquellen geprüft – Hersteller, Standard oder Gesetzestext. Wer es nicht glaubt, muss es nicht: Da steht, wo es nachzulesen ist.