Je souhaite utiliser rsync pour sauvegarder les données d'un serveur Linux distant sur mon Mac local. Et je veux initialiser cette opération sur mon Mac local. Tout fonctionne bien sauf qu'il y a un problème de caractère spécial: chaque fois que je relance l'opération rsync (après la synchronisation initiale), les fichiers avec des caractères spéciaux sont d'abord supprimés puis resynchronisés. Pour autant que je comprends, il y a un problème avec différents jeux de caractères, et la solution préférée semble être d'utiliser l' --iconv
option:
Vous pouvez utiliser l'option --iconv de rsync pour convertir entre UTF-8 NFC et NFD, au moins si vous êtes sur un Mac. Il existe un jeu de caractères spécial utf-8-mac 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é.
Le problème est que cela ne fonctionne que dans un sens pour moi, à savoir lors de la synchronisation du Mac vers Linux. Mais je veux «aller dans l'autre sens», c'est-à-dire synchroniser DE la machine Linux vers le Mac. Et je veux initialiser l'opération à partir de mon Mac local. Mais quand j'essaye:
rsync -av --delete --iconv=utf-8,utf-8-mac mynas:remotedir/ localdir/
Je reçois une 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 ne comprends pas pourquoi cela ne fonctionne pas. Ma version rsync sur Mac est mise à jour à partir de 2.6.9. à 3.1.1. en utilisant Macports . Notez que l'opération fonctionne alors lorsque je (sur le Mac, nota bene) lance une rsync du Mac vers Linux:
rsync -av --delete --iconv=utf-8-mac,utf-8 localdir/ mynas:remotedir/
Mais aller dans l'autre sens Ȉ partir du mac - c'est ce que je veux faire - ne fonctionne pas.
Curieusement, les tests pour lancer la synchronisation à partir de la machine Linux rendent 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, notez, la déclaration très étrange [server=2.6.9]
, bien que j'ai mis à jour la 3.1.1 sur Mac. Pour certaines raisons, il semble que ma machine Linux ne «voit» que la version rsync d'origine sur le Mac.
Une suggestion sur la façon de résoudre ce problème?
MISE À JOUR 23 octobre : L'excellente suggestion de @Lee Johnson (voir ci-dessous), lancer la synchronisation à partir du serveur Linux fonctionne maintenant. Pour être complet, j'ai maintenant essayé toutes les combinaisons, et un motif intéressant émerge:
SUR MAC:
TRAVAUX: fichiers de Mac à Linux
ÉCHEC: fichiers de Linux vers Mac
SUR LINUX
TRAVAUX: fichiers de Linux à Mac
ÉCHEC: fichiers de Mac à Linux
En d'autres termes, l' --iconv
option ne semble fonctionner que dans un sens, avec des fichiers de la machine locale vers la télécommande, et non l'inverse. Cela ressemble à un bug pour moi, mais c'est peut-être la façon dont il est censé fonctionner?
Quelqu'un peut-il partager la lumière à ce sujet?
rsync
(par exemple depuis homebrew) sur le mac et l'appeler depuis linux, il est nécessaire de spécifier le chemin correct en utilisant--rsync-path="/usr/local/bin/rsync"
.DS_Store
de synchronisations et de ce Mac OS X ne pouvait pas les répertoires avec suppression de ces fichiers à l' intérieur. J'ai configuré les jeux de caractères avec--iconv
, le chemin rsync sur le mac avec--rsync-path
(j'utilise homebrew), puis j'ai dû ajouter--delete-excluded
pour que les répertoires tenaces puissent être supprimés.Réponses:
Après beaucoup d'expérimentations, et en grande partie grâce aux suggestions utiles de @Lee Johnson, j'ai finalement trouvé la solution, qui me semble maintenant embarrassante. En grande partie à cause d'un commentaire que j'ai lu en recherchant le 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. On devrait plutôt
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 veux synchroniser des fichiers à partir du mac ou de la machine linux.Ensuite, cela fonctionne comme par magie!
la source
Avez-vous récemment effectué une mise à niveau vers OS X Yosemite? J'ai eu le même problème, avant de me souvenir que j'avais mis à jour / usr / bin / rsync avec la version 3.1. Lorsque je suis passé à Yosemite, cela a été remplacé par l'ancienne version 2.6.9.
Dans mon propre cas, j'ai résolu le problème sur le Mac en reliant ma rsync 3.1 dans / usr / bin:
la source
--iconv
soit pris en charge dans 2.6.9; même si rsync expédie simplement l'option à l'hôte distant pour la gestion, il doit reconnaître l'option du côté OS X. Quewhich rsync; rsync --version
vous dit un terminal OS X?--rsync-path=/opt/local/bin/rsync
pour obtenir votre version 3.1.1 connue du côté Mac?