web-dev-qa-db-fra.com

Rsync avec des fichiers de caractères spéciaux ne fonctionnant pas entre Mac et Linux

Je souhaite utiliser rsync pour sauvegarder mon serveur Ubuntu avec un disque résidant sur un Mac. Mais je ne le fais pas fonctionner correctement, car chaque fois que je relance l’opération rsync après l’heure initiale, les fichiers contenant des caractères spéciaux sont d’abord supprimés puis resynchronisés. Il semble qu'il y ait un problème avec différents jeux de caractères.

Le solution préférée semble utiliser l’option --iconv:

Vous pouvez utiliser l'option --iconv de rsync pour convertir UTF-8 NFC & NFD, du moins si vous êtes sur un Mac. Il existe un jeu de caractères spécial utf-8-mac qui correspond à UTF-8 NFD. Donc, pour copier des fichiers de votre Mac sur votre NAS, vous devez exécuter quelque chose comme:

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

Ceci 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é.

Grâce à @Jan, j'ai mis à jour ma version de rsync sur mon mac à partir de la version 2.6.9. à 3.1.1. Pourtant, je ne suis toujours pas tout à fait là car je reçois maintenant une autre erreur:

iconv_open("UTF-8", "utf-8-mac") failed
rsync error: requested action not supported (code 4) at rsync.c(118) [sender=3.0.9]
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [Receiver=3.1.1]

Je n'arrive pas à comprendre pourquoi "l'action demandée n'est pas prise en charge" car il semble que la version de rsync sur mon Ubuntu (12.04) est post 3.x.x et devrait donc prendre en charge l'option --iconv.

EDIT: Laissez-moi ajouter que lorsque je (sur le Mac, nota bene) lance un rsync de Mac à Linux, tout fonctionne à merveille:

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

Mais aller dans l'autre sens "du mac ne fonctionne pas. Curieusement, tester pour lancer le rsync à partir de la machine linux rend ce message étrange:

rsync: on remote machine: --iconv=UTF-8-MAC: unknown option
rsync error: syntax or usage error (code 1) at /SourceCache/rsync/rsync-45/rsync/main.c(1333) [server=2.6.9]
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]

y compris la très étrange revendication [server=2.6.9], même si j'ai mis à jour à 3.1.1 sur Mac. Pour certaines raisons, il semble que ma machine Linux ne voit que la version originale de rsync sur le Mac.

Toute suggestion sur la façon de résoudre ce problème?

17
Nick The Swede

La solution était d'une simplicité embarrassante: en grande partie à cause d'un commentaire que j'ai lu lors de la recherche du problème, je pensais que vous étiez censé spécifier le jeu de caractères dans l'ordre de transformation; mais il semble que ce ne soit pas la syntaxe correcte. Plutôt, on devrait toujours utiliser --iconv=utf-8-mac,utf-8 lors de l’initialisation du rsync à partir du mac, et toujours utiliser --iconv=utf-8,utf-8-mac lors de l’initialisation du rsync à partir de la machine Linux, peu importe si je souhaite synchroniser des fichiers de la machine mac ou linux.

Ensuite, cela fonctionne comme par magie!

EDIT: En effet, parfois, vérifier la page de manuel de près est une bonne chose à faire. Le voici noir sur blanc:

--iconv=CONVERT_SPEC
              Rsync  can  convert  filenames between character sets using this
              option.  Using a CONVERT_SPEC of "." tells rsync to look up  the
              default  character-set via the locale setting.  Alternately, you
              can fully specify what conversion to do by giving a local and  a
              remote   charset   separated   by   a   comma   in   the   order
              --iconv=LOCAL,REMOTE, e.g.  --iconv=utf8,iso88591.   This  order
              ensures  that the option will stay the same whether you're Push-
              ing  or  pulling  files.
16
Nick The Swede

Je peux confirmer que cela fonctionne, j'avais le même problème. Dans mon cas, tout fichier avec un caractère accentué était illisible sur la destination. Je l'ai seulement repéré en exécutant une comparaison de dossiers sur mon Mac à l'aide de l'application Compare Folders: https://iTunes.Apple.com/gb/app/compare-folders/id816042486?mt=12

Ajout de ce qui suit --iconv = utf-8-mac, utf-8 et BOOM! rsync a remplacé chaque fichier accentué par un nouveau.

Pour ajouter des informations car il semble que les liens ci-dessus ne fonctionnent plus, mettez à niveau rsync en 3.1.2, installez Macports et exécutez: Sudo port install rsync

La raison pour laquelle vous voyiez le serveur distant revenir à la version 2.6.9 est que l'ancienne version existe toujours et que le serveur distant voit celle-ci à la place de la nouvelle.

La version 2.6.9 est située dans/usr/bin

2
vandit6354