Conversione dei nomi di file NFD UTF-8 in NFC UTF-8, in rsync o afpd


24

Ho un file server di casa che esegue FreeNAS 8. Qualche giorno fa ho usato rsync per caricare tutta la mia libreria iTunes da Mac in modo da poter caricare la mia libreria sulla rete invece che su un'unità USB lenta. Questo per lo più ha funzionato, e iTunes funziona molto meglio ora, ma sto riscontrando problemi nell'accedere a qualsiasi canzone che contiene caratteri non ascii (ho notato il problema per la prima volta durante il caricamento delle tracce Queensrÿche). I file verrebbero visualizzati nel Finder, ma qualsiasi tentativo di accedervi li faceva svanire fino a quando non mi riconnettevo al server.

Dopo alcune ricerche ho scoperto che questo perché OSX utilizza un diverso ordine di caratteri UTF da Linux. I filesystem OSX usano Unicode Normalization Form D (NFD), dove Linux usa Form C (NFC). Rsync non converte questi moduli quando esegue la copia dal mio mac al server, ora quando iTunes tenta di accedere a un file con un carattere speciale sulla rete, i file sul server hanno la codifica sbagliata e segnalazioni afpd che non ' non esiste.

Qual è il modo migliore per affrontare questo problema? È possibile fare in modo che rsync esegua la conversione unicode durante il caricamento della libreria di base sul server? Posso configurare afpd per trasmettere / ricevere nomi di file in formato NFD? Esiste una soluzione semplice per modificare i nomi dei file sul server? Ho trovato alcune cose su un programma chiamato convmv, ma non so se posso eseguirlo su FreeNAS.


1
Sembra un bug con la versione OS X di rsync.
Ignacio Vazquez-Abrams,

Risposte:


4

Nota: se si utilizza la versione 3.0.0 o più recente di rsync, l' --iconvopzione come indicato nelle altre risposte è chiaramente la soluzione migliore.

Qualcosa che dovrebbe funzionare è rsyncing tra la directory di origine e il file system remoto montato (SMB, NFS, AFP), che rsync tratterà semplicemente come file system locale.

Tuttavia, non so quanto funzioni nella pratica e devi risolvere diversi problemi, ad esempio l'algoritmo di trasferimento delta non verrà utilizzato per impostazione predefinita (poiché l'origine e la destinazione sono "locali") (forse - nessun file intero funzionerà?), è necessario verificare, ad esempio, che SMB preservi efficacemente i tempi di modifica, ecc.


Questo è in definitiva quello che ho finito per fare. Ho eliminato l'intera raccolta dal NAS ed eseguito di nuovo rsync, utilizzando la connessione CIFS montata localmente anziché il demone rsync sul NAS. Ora sto solo risolvendo i problemi di iTunes dalla capitalizzazione dei nomi di file. : /
ChiperSoft,

50

Puoi usare l' --iconvopzione rsync per convertire tra UTF-8 NFC e NFD, almeno se sei su un Mac. Esiste un utf-8-macset di caratteri speciali che sta per UTF-8 NFD. Quindi, per copiare i file dal Mac al NAS, è necessario eseguire qualcosa del tipo:

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

Ciò convertirà tutti i nomi di file locali da UTF-8 NFD a UTF-8 NFC sul server remoto. Il contenuto dei file non sarà interessato.


1
Non sono il Poster originale, quindi non dipende da me, ma questa è una soluzione molto più pulita ed efficiente di quella contrassegnata come accettata. Interpretarlo con certezza, sarà così utile.
ItsGC

1
Bella risposta; Non avevo idea che UTF8-MACsignifichi NFD; se usato con iconvse stesso, fornisce un meccanismo generico per la traduzione avanti e indietro tra NFC e NFD.
mklement

ottima risposta, questo risolve un problema di vecchia data nella sincronizzazione di un mac con un server Linux!
Meduz,

2
Su Mac potresti anche aver bisognobrew tap homebrew/dupes && brew install homebrew/dupes/rsync && rehash
SaveTheRbtz

Ricevorsync: --iconv: unknown option
KMC il

7

Attualmente sto usando rsync --iconvcosì:

Copia dei file dal server Linux alla macchina OS X.

È necessario eseguire questo comando dalla macchina OS X :

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

Copia dei file dalla macchina OS X al server Linux

Dovresti eseguire questo comando dalla macchina OS X :

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

Non utilizzare rsync per copiare i file sul NAS. Quando si utilizza rsync per copiare i file, i nomi dei file verranno archiviati sul NAS in formato UTF NFD (ovvero il formato OSX) ma il server Samba in esecuzione sul NAS comprende solo i nomi dei file in formato UTF NFC. Utilizzare l'interfaccia CIFS / SMB (Samba) per copiare i file e tutto andrà bene.


0

Dalla mia esperienza, consiglio di usare SMB invece di ssh. Iconv risolve il problema con la codifica, ma esiste ancora un problema con i caratteri consentiti su sistemi diversi:

Nome file originale su Mac:

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

Dopo la copia di rsync su 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

Dopo la copia di rsync su ssh (con formica senza flag 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.