Konwertowanie nazw plików UTF-8 NFD na UTF-8 NFC w rsync lub afpd

24

Mam domowy serwer plików z systemem FreeNAS 8. Kilka dni temu użyłem rsync do przesłania całej mojej biblioteki iTunes z komputera Mac, aby móc załadować swoją bibliotekę przez sieć zamiast z wolnego dysku USB. To w większości działało, a iTunes działa teraz znacznie lepiej, ale mam problemy z dostępem do utworów, które zawierają postacie inne niż ascii (po raz pierwszy zauważyłem problem podczas ładowania utworów Queensrÿche). Pliki pojawiałyby się w Finderze, ale każda próba dostępu do nich powodowała, że ​​znikały, dopóki nie połączyłem się ponownie z serwerem.

Po kilku badaniach odkryłem, że dzieje się tak, ponieważ OSX używa innej kolejności znaków UTF niż Linux. Systemy plików OSX używają Unicode Normization Form D (NFD), gdzie Linux używa Form C (NFC). Rsync nie konwertuje tych formularzy, gdy wykonuje kopię z mojego komputera Mac na serwer, teraz, gdy iTunes próbuje uzyskać dostęp do pliku ze znakiem specjalnym przez sieć, pliki na serwerze mają nieprawidłowe kodowanie i nie zgłaszają raportów afpd ' istnieje.

Jaki jest najlepszy sposób rozwiązania tego problemu? Czy jest możliwe, aby rsync wykonał konwersję Unicode podczas przesyłania biblioteki podstawowej na serwer? Czy mogę skonfigurować afpd do przesyłania / odbierania nazw plików w formacie NFD? Czy istnieje łatwe rozwiązanie do zmiany nazw plików na serwerze? Znalazłem trochę informacji o programie o nazwie convmv, ale nie wiem, czy mogę uruchomić to na FreeNAS.

ChiperSoft
źródło
1
Brzmi jak błąd w wersji rsync w wersji OS X.
Ignacio Vazquez-Abrams,

Odpowiedzi:

4

Uwaga: Jeśli używasz wersji 3.0.0 lub nowszej wersji rsync, --iconvopcja jak wspomniano w innych odpowiedziach jest zdecydowanie najlepszym rozwiązaniem.

Coś, co powinno działać, to rsynchronizacja między katalogiem źródłowym a zamontowanym zdalnym systemem plików (SMB, NFS, AFP), który rsync będzie traktował tylko jako lokalny system plików.

Nie wiem jednak, jak dobrze to działa w praktyce, i musisz obejść różne problemy, na przykład algorytm transferu delta nie będzie domyślnie używany (ponieważ źródło i miejsce docelowe są „lokalne”) (może - no-cały plik będzie działał?), musisz sprawdzić np., że SMB skutecznie zachowuje czasy modyfikacji itp.

LCC
źródło
Ostatecznie to właśnie skończyłem. Usunąłem całą kolekcję z NAS i ponownie uruchomiłem rsync, używając lokalnie zamontowanego połączenia CIFS zamiast demona rsync na NAS. Teraz tylko naprawiam problemy iTunes z wielkimi literami. : /
ChiperSoft,
50

Możesz użyć --iconvopcji rsync do konwersji między UTF-8 NFC i NFD, przynajmniej jeśli korzystasz z komputera Mac. Istnieje specjalny utf-8-maczestaw znaków, który oznacza UTF-8 NFD. Aby skopiować pliki z komputera Mac na serwer NAS, musisz uruchomić coś takiego:

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

Spowoduje to konwersję wszystkich lokalnych nazw plików z UTF-8 NFD na UTF-8 NFC na zdalnym serwerze. Zawartość plików nie zostanie zmieniona.

Lennart L.
źródło
1
Nie jestem oryginalnym plakatem, więc to nie zależy ode mnie, ale jest to o wiele czystsze i wydajniejsze rozwiązanie niż to oznaczone jako zaakceptowane. Wystąpienie tego na pewno będzie bardzo przydatne.
ItsGC
1
Świetna odpowiedź; Nie miałem pojęcia, że ​​to UTF8-MACoznacza NFD; w połączeniu z iconvsamym sobą zapewnia ogólny mechanizm translacji w obie strony między NFC i NFD.
mielement
świetna odpowiedź, to rozwiązuje długotrwały problem z synchronizacją Mac z serwerem linux!
meduz
2
Na brew tap homebrew/dupes && brew install homebrew/dupes/rsync && rehash
Macu
Dostajęrsync: --iconv: unknown option
KMC
7

Obecnie używam w rsync --iconvten sposób:

Kopiowanie plików z serwera Linux na komputer z systemem OS X

Powinieneś wykonać to polecenie z komputera z systemem OS X :

rsync -a --delete --iconv=UTF-8-MAC,UTF-8 '[email protected]:/home/username/path/on/server/' /Users/username/path/on/machine/

Kopiowanie plików z komputera z systemem OS X na serwer Linux

Powinieneś wykonać to polecenie z komputera z systemem OS X :

rsync -a --delete --iconv=UTF-8-MAC,UTF-8 /Users/username/path/on/machine/ '[email protected]:/home/username/path/on/server/'
Envek
źródło
0

Nie używaj rsync do kopiowania plików na NAS. Kiedy użyjesz rsync do skopiowania plików, nazwy plików będą przechowywane na twoim NAS w formacie UTF NFD (tj. OSX), ale serwer Samba działający na twoim NAS rozumie tylko nazwy plików w formacie UTF NFC. Użyj interfejsu CIFS / SMB (Samba), aby skopiować pliki, a wszystko będzie dobrze.

dlaczego ja
źródło
0

Z mojego doświadczenia zalecam używanie SMB zamiast ssh. Iconv rozwiązuje problem z kodowaniem, ale nadal występuje problem z dozwolonymi znakami w różnych systemach:

Oryginalna nazwa pliku na komputerze Mac:

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

Po skopiowaniu przez rsync przez 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

Po skopiowaniu przez rsync przez ssh (z mrówką bez flagi iconv):

-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
lukdz
źródło