An diesem Phänomen habe ich jetzt eine ganze Weile gebastelt – aber ich bin zufrieden mit der Lösung 🙂
Problem: Umlaute in Dateinamen werden Unter Windows anders angelegt als unter Linux (Shell/Konsole/X) und noch anders unter DOS. Einen brauchbarer Fileserver mit Umlauten in Dateinamen ist unter Samba praktisch nicht zu betrieben.
Lösung: Die meisten Phänomene mit deutschen Umlauten bekommt man in den Griff, indem man das Dateisystem weiterhin in UTF-8 betreibt (es gibt da die wildesten Anleitungen im Netz), aber die Umlaute durch Samba hart in Windows-Ansi (Codeseite 1252) schreiben lässt. Da Windows selber immer abwärtskompatibel zu DOS bleibt (die gute alte CP850), kann man 1252 in der Regel ohne Probleme zu Samba 3.0.3x (smb.conf) hinzufügen:
[global] unix charset = UTF-8 dos charset = cp1252
In Samba <3 lautet die Option (hier alternativ mit ISO8859-1 für Windows-ANSI):
character set = ISO8859-1
Ein schnelles
/etc/init.d/smb reload
läd die Config im laufenden Betrieb auch neu und alles ist gut.
Achtung – Bestehende Dateien werden dadurch natürlich nicht verändert. Schon geschriebene Umlaute bleiben so wirsch wie sie sind. Das gilt auch nur für den Zeichensatz CP1252, also nicht für den ganzen UTF-8 Zeichenraum. Da wird es so auch weiterhin diese lustigen Codierungsfehler geben.
Bestehende falsche Umlaute im Dateinamen nachträglich (bulk) korrigieren
In der Shell kann man solche falsch benannten Dateien natürlich einfach einzeln umbenennen; zum Beispiek mit mv (oder dem rename-alias):
mv seltsamezeichen???.txt seltsamezeichenÄÖÜ.txt
Das Fragezeichen ist hier der Platzhalter für ’nur ein Zeichen, aber jedes‘. Achtung beim Escapen von Leereichen ( ), hier habe ich mich auch schon ein paarmal „Ganz sch?n ge?rgert.txt“ weil ich einen Backslash an der falschen Stelle eingebaut hatte.
Lösung: Bulk umbenennen mit „convmv“. Das ist bei allen großen Distributionen dabei oder im Repository (warum wohl?) und funktioniert so:
convmv -f iso-8859-15 -t utf-8 --notest /foo/bar
Damit werden in /foo/bar alle Dateinamen von ISO-8859-15 nach UTF-8 konvertiert. Mit -r geht das natürlich auch rekursiv.