Als wir ein CMS-Dateisystem und einen MySQL-Dump über rsync von einem Linux-Server zu einem anderen Linux-Server transportierten, verwendeten wir ein MacOS in der Mitte, um die Daten vorübergehend zu speichern. Nachdem das CMS auf dem anderen Linux-Server hochgefahren war, waren alle statischen Bilddateien verfügbar. Aber alle Dateinamen mit deutschen Umlauten wurden vom CMS nicht gefunden, obwohl sie sichtbar und zugänglich waren. Wir fanden schnell heraus, dass genau das passiert:
Wenn ich unter Linux einen Dateinamen mit deutschen Umlauten so erstelle:
linux$ mkdir umlauttest
linux$ touch umlauttest/äöü
Und dann gehen Sie zu einem Mac und geben Sie dort ein rsync aus, um das Verzeichnis auf meinen Mac zu kopieren ...
mac$ rsync -a user@linux:umlauttest .
Und dann kopiere es von meinem Mac zurück nach Linux:
mac$ rsync -a umlauttest/. user@linux:umlauttest2
Dann habe ich wirklich ein Problem auf meinem Linux, weil der Dateiname irgendwie kaputt ist.
linux$ diff umlauttest umlauttest2
Only in umlauttest2: äöü
Only in umlauttest: äöü
Das liegt daran, dass MacOS die Dateinamenszeichen tatsächlich in zusammengesetzte Unicode-Zeichen konvertiert, was ich wirklich als Verstümmelung von Metadaten bezeichne. Dieses Verhalten tritt auch beim scp
Kopieren von Dateien auf.
Gibt es eine Möglichkeit, dies zu verhindern?
Verwenden Sie die --iconv
Option für rsync, um anzugeben, wie Dateinamen auf den lokalen und entfernten Hosts codiert werden – dies könnte Ihnen dabei helfen, die Dateinamen intakt zu halten.
Wenn Sie vom Linux-Server auf den Mac kopieren, fügen Sie dem rsync
Befehl Folgendes hinzu:
--iconv=utf-8,utf-8-mac
Verwenden Sie beim Kopieren vom Mac auf den Linux-Server Folgendes:
--iconv=utf-8-mac,utf-8
Beachten Sie, dass Sie eine relativ neue Version von rsync (>3.0) benötigen, um die --iconv
Option zu haben. Apple liefert nur eine alte Version, also müssen Sie zu einer anderen Seite gehen, zB zu einem Paketmanager wie Macports oder Homebrew