Konvertieren von UTF-8 NFD-Dateinamen in UTF-8 NFC, entweder in rsync oder afpd


24

Ich habe einen Heimdateiserver mit FreeNAS 8. Vor einigen Tagen habe ich mit rsync meine gesamte iTunes-Mediathek von einem Mac hochgeladen, damit ich meine Mediathek über das Netzwerk laden kann, anstatt von einem langsamen USB-Laufwerk. Das hat größtenteils funktioniert und iTunes läuft jetzt viel besser, aber ich habe Probleme beim Zugriff auf Titel, die keine ASCII-Zeichen enthalten (ich habe das Problem zum ersten Mal beim Laden von Queensrèche-Titeln bemerkt). Die Dateien wurden im Finder angezeigt, aber jeder Versuch, auf sie zuzugreifen, ließ sie verschwinden, bis ich mich wieder mit dem Server verbunden habe.

Nach einigen Recherchen habe ich herausgefunden, dass OSX eine andere UTF-Zeichenreihenfolge als Linux verwendet. OSX-Dateisysteme verwenden Unicode Normalization Form D (NFD), während Linux Form C (NFC) verwendet. Rsync konvertiert diese Formulare nicht, wenn es die Kopie von meinem Mac auf den Server ausführt. Wenn iTunes nun versucht, über das Netzwerk auf eine Datei mit einem Sonderzeichen zuzugreifen, haben die Dateien auf dem Server die falsche Codierung und es werden keine afpd-Berichte angezeigt. ' existiert nicht.

Wie kann dieses Problem am besten behoben werden? Kann rsync die Unicode-Konvertierung ausführen, während die Basisbibliothek auf den Server hochgeladen wird? Kann ich afpd so konfigurieren, dass Dateinamen im NFD-Format gesendet / empfangen werden? Gibt es eine einfache Lösung, um die Dateinamen auf dem Server zu ändern? Ich habe einige Dinge über ein Programm namens convmv gefunden, aber ich weiß nicht, ob ich das auf FreeNAS ausführen kann.


1
Klingt nach einem Fehler in der OS X-Version von rsync.
Ignacio Vazquez-Abrams

Antworten:


4

Hinweis: Wenn Sie Version 3.0.0 oder höher von rsync verwenden, ist die --iconvin den anderen Antworten erwähnte Option eindeutig die überlegene Lösung.

Etwas, das funktionieren sollte , ist das Synchronisieren zwischen dem Quellverzeichnis und dem bereitgestellten Remote-Dateisystem (SMB, NFS, AFP), das von rsync nur als lokales Dateisystem behandelt wird.

Ich weiß jedoch nicht, wie gut dies in der Praxis funktioniert, und Sie müssen verschiedene Probleme umgehen, zum Beispiel wird der Delta-Transfer-Algorithmus nicht standardmäßig verwendet (da Quelle und Ziel „lokal“ sind) (möglicherweise -). no-whole-file wird funktionieren?), müssen Sie zB überprüfen, ob SMB die Änderungszeiten effektiv einhält, usw.


Dies ist letztendlich das, was ich getan habe. Ich habe die gesamte Sammlung vom NAS gelöscht und rsync erneut ausgeführt, wobei die lokal gemountete CIFS-Verbindung anstelle des rsync-Dämons auf dem NAS verwendet wurde. Jetzt behebe ich nur iTunes-Probleme aufgrund der Großschreibung von Dateinamen. : /
ChiperSoft

50

Sie können die --iconvOption von rsync verwenden , um zwischen UTF-8 NFC und NFD zu konvertieren, zumindest wenn Sie einen Mac verwenden. Es gibt einen speziellen utf-8-macZeichensatz, der für UTF-8 NFD steht. Um also Dateien von Ihrem Mac auf Ihren NAS zu kopieren, müssen Sie Folgendes ausführen:

rsync -a --iconv=utf-8-mac,utf-8 localdir/ mynas:remotedir/

Dadurch werden alle lokalen Dateinamen von UTF-8 NFD in UTF-8 NFC auf dem Remote-Server konvertiert. Der Inhalt der Dateien wird nicht beeinflusst.


1
Ich bin nicht das Originalplakat, es liegt also nicht an mir, aber dies ist eine viel sauberere und effizientere Lösung als die als akzeptiert gekennzeichnete. Darsteller dies sicher, wird so nützlich sein.
ItsGC

1
Gute Antwort; Ich hatte keine Ahnung, dass das UTF8-MACfür NFD steht; Wenn es mit sich iconvselbst verwendet wird, bietet es einen generischen Mechanismus für das Hin- und Herwechseln zwischen NFC und NFD.
mklement

tolle antwort, dies löst ein langjähriges problem bei der synchronisation eines macs mit einem linux server!
Meduz

2
Auf dem Mac müssen Sie möglicherweise auchbrew tap homebrew/dupes && brew install homebrew/dupes/rsync && rehash
SaveTheRbtz

Ich bekommersync: --iconv: unknown option
KMC

7

Derzeit benutze ich rsync --iconvwie folgt:

Kopieren von Dateien vom Linux-Server auf einen OS X-Computer

Sie sollten diesen Befehl auf einem OS X-Computer ausführen :

rsync -a --delete --iconv=UTF-8-MAC,UTF-8 'username@server.ip.address.here:/home/username/path/on/server/' /Users/username/path/on/machine/

Kopieren von Dateien von einem OS X-Computer auf einen Linux-Server

Sie sollten diesen Befehl auf einem OS X-Computer ausführen :

rsync -a --delete --iconv=UTF-8-MAC,UTF-8 /Users/username/path/on/machine/ 'username@server.ip.address.here:/home/username/path/on/server/'

0

Verwenden Sie nicht rsync, um die Dateien auf Ihren NAS zu kopieren. Wenn Sie die Dateien mit rsync kopieren, werden die Dateinamen im UTF-NFD-Format (dh im OSX-Format) auf Ihrem NAS gespeichert, aber der auf Ihrem NAS ausgeführte Samba-Server versteht nur Dateinamen im UTF-NFC-Format. Verwenden Sie die CIFS / SMB (Samba) -Schnittstelle, um die Dateien zu kopieren, und alles wird gut.


0

Aus meiner Erfahrung empfehle ich die Verwendung von SMB anstelle von ssh. Iconv behebt das Kodierungsproblem, aber es gibt immer noch ein Problem mit zulässigen Zeichen auf verschiedenen Systemen:

Ursprünglicher Dateiname auf dem Mac:

https-//img-9gag-fun.9cache.com/photo/adK9jzN_460s

Nach dem Kopieren per rsync über SMB:

-as seen by Mac (over SMB):     https-//img-9gag-fun.9cache.com/photo/adK9jzN_460s
-as seen by Ubuntu (over SMB):  https-img-9gag-fun.9cache.comphotoadK9jzN_460s
-as seen by Windows10 (over SMB):   https-∀∀img-9gag-fun.9cache.com∀photo∀adK9jzN_460s
-as seen by Ubuntu server locally:  https-img-9gag-fun.9cache.comphotoadK9jzN_460s

Nach dem Kopieren per rsync über ssh (mit Ameise ohne Iconv Flag):

-as seen by Mac (over SMB):     H0INHQ~6
-as seen by Ubuntu (over SMB):  H0INHQ~6
-as seen by Windows10 (over SMB):   H0INHQ~6
-as seen by Ubuntu server locally:  https-::img-9gag-fun.9cache.com:photo:adK9jzN_460s
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.