Conversion des noms de fichiers NFD UTF-8 en NFC UTF-8, en rsync ou afpd

24

J'ai un serveur de fichiers à domicile exécutant FreeNAS 8. Il y a quelques jours, j'ai utilisé rsync pour télécharger l'intégralité de ma bibliothèque iTunes à partir de Mac afin de pouvoir charger ma bibliothèque sur le réseau plutôt que sur une clé USB lente. Cela a surtout fonctionné, et iTunes fonctionne beaucoup mieux maintenant, mais je rencontre des problèmes pour accéder à toutes les chansons qui contiennent des caractères non ascii (j'ai d'abord remarqué le problème lors du chargement des pistes Queensrÿche). Les fichiers s'afficheraient dans le Finder, mais toute tentative d'y accéder les faisait disparaître jusqu'à ce que je me reconnecte au serveur.

Après quelques recherches, j'ai découvert que c'était parce qu'OSX utilise un ordre de caractères UTF différent de Linux. Les systèmes de fichiers OSX utilisent le formulaire de normalisation Unicode D (NFD), où Linux utilise le formulaire C (NFC). Rsync ne convertit pas ces formulaires lorsqu'il effectue la copie de mon mac vers le serveur, maintenant quand iTunes essaie d'accéder à un fichier avec un caractère spécial sur le réseau, les fichiers sur le serveur ont le mauvais encodage et les rapports afpd qu'ils ne font pas '' n'existe pas.

Quelle est la meilleure façon de résoudre ce problème? Est-il possible de faire rsync effectuer la conversion unicode lors du téléchargement de la bibliothèque de base sur le serveur? Puis-je configurer afpd pour transmettre / recevoir des noms de fichiers au format NFD? Existe-t-il une solution simple pour changer les noms de fichiers sur le serveur? J'ai trouvé des informations sur un programme nommé convmv, mais je ne sais pas si je peux l'exécuter sur FreeNAS.

ChiperSoft
la source
1
Cela ressemble à un bug avec la version OS X de rsync.
Ignacio Vazquez-Abrams

Réponses:

4

Remarque: Si vous utilisez la version 3.0.0 ou une version plus récente de rsync, l' --iconvoption mentionnée dans les autres réponses est clairement la solution supérieure.

Quelque chose qui devrait fonctionner est la synchronisation entre le répertoire source et le système de fichiers distant monté (SMB, NFS, AFP), que rsync traitera simplement comme un système de fichiers local.

Cependant, je ne sais pas si cela fonctionne bien dans la pratique, et vous devez contourner différents problèmes, par exemple l'algorithme de transfert delta ne sera pas utilisé par défaut (puisque la source et la destination sont «locales») (peut-être - aucun fichier entier ne fonctionnera?), vous devez vérifier, par exemple, que SMB préserve efficacement les temps de modification, etc.

LCC
la source
C'est finalement ce que j'ai fini par faire. J'ai supprimé toute la collection du NAS et exécuté à nouveau rsync, en utilisant la connexion CIFS montée localement au lieu du démon rsync sur le NAS. Maintenant, je corrige simplement les problèmes d'itunes liés à la capitalisation des noms de fichiers. : /
ChiperSoft
50

Vous pouvez utiliser l' --iconvoption de rsync pour convertir entre UTF-8 NFC et NFD, au moins si vous êtes sur un Mac. Il existe un utf-8-macjeu de caractères spécial qui signifie UTF-8 NFD. Donc, pour copier des fichiers de votre Mac vers votre NAS, vous devez exécuter quelque chose comme:

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

Cela convertira tous les noms de fichiers locaux de UTF-8 NFD en UTF-8 NFC sur le serveur distant. Le contenu des fichiers ne sera pas affecté.

Lennart L
la source
1
Je ne suis pas l'affiche originale, donc ce n'est pas à moi, mais c'est une solution beaucoup plus propre et efficace que celle signalée comme acceptée. Mettant en vedette cela à coup sûr, sera tellement utile.
ItsGC
1
Très bonne réponse; Je n'avais aucune idée de l' UTF8-MACacronyme de NFD; lorsqu'il est utilisé avec iconvlui-même, cela fournit un mécanisme générique pour la traduction entre NFC et NFD.
mklement
excellente réponse, cela résout un problème de longue date dans la synchronisation d'un mac avec un serveur linux!
meduz
2
Sur Mac, vous devrez peut-être égalementbrew tap homebrew/dupes && brew install homebrew/dupes/rsync && rehash
SaveTheRbtz
Je reçoisrsync: --iconv: unknown option
KMC
7

Actuellement, j'utilise rsync --iconvcomme ceci:

Copie de fichiers d'un serveur Linux vers une machine OS X

Vous devez exécuter cette commande depuis la machine OS X :

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

Copie de fichiers d'une machine OS X sur un serveur Linux

Vous devez exécuter cette commande depuis la machine OS X :

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

N'utilisez pas rsync pour copier les fichiers sur votre NAS. Lorsque vous utilisez rsync pour copier les fichiers, les noms de fichiers seront stockés sur votre NAS au format UTF NFD (c'est-à-dire le format OSX) mais le serveur Samba fonctionnant sur votre NAS ne comprend que les noms de fichiers au format UTF NFC. Utilisez l'interface CIFS / SMB (Samba) pour copier les fichiers et tout ira bien.

pourquoi moi
la source
0

D'après mon expérience, je recommande d'utiliser SMB au lieu de ssh. Iconv résout le problème d'encodage, mais il y a toujours un problème avec les caractères autorisés sur différents systèmes:

Nom de fichier d'origine sur Mac:

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

Après copie par rsync sur 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

Après copie par rsync sur ssh (avec fourmi sans drapeau 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
la source