Quiero usar rsync para hacer una copia de seguridad de los datos de un servidor Linux remoto en mi Mac local. Y quiero iniciar esta operación en mi Mac local. Todo funciona bien, excepto que hay un problema especial de caracteres: cada vez que vuelvo a ejecutar la operación rsync (después de la sincronización inicial), los archivos con caracteres especiales se eliminan primero y luego se vuelven a sincronizar. Según tengo entendido, hay un problema con los diferentes conjuntos de caracteres, y la solución preferida parece ser usar la --iconv
opción:
Puede usar la opción --iconv de rsync para convertir entre UTF-8 NFC y NFD, al menos si está en una Mac. Hay un conjunto de caracteres utf-8-mac especial que significa UTF-8 NFD. Entonces, para copiar archivos de su Mac a su NAS, necesitaría ejecutar algo como:
rsync -a --iconv=utf-8-mac,utf-8 localdir/ mynas:remotedir/
Esto convertirá todos los nombres de archivos locales de UTF-8 NFD a UTF-8 NFC en el servidor remoto. El contenido de los archivos no se verá afectado.
El problema es que esto solo funciona 'de una manera' para mí, es decir, cuando se sincroniza desde Mac a Linux. Pero quiero 'ir hacia otro lado', es decir, sincronizar DESDE la máquina Linux a la Mac. Y quiero iniciar la operación desde mi Mac local. Pero cuando lo intento:
rsync -av --delete --iconv=utf-8,utf-8-mac mynas:remotedir/ localdir/
Recibo un error:
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]
No puedo entender por qué esto no funciona. Mi versión rsync en Mac se actualizó desde 2.6.9. a 3.1.1. usando Macports . Tenga en cuenta que la operación funciona cuando yo (en Mac, nota bene) inicio un rsync DESDE Mac hacia Linux:
rsync -av --delete --iconv=utf-8-mac,utf-8 localdir/ mynas:remotedir/
Pero ir al otro lado 'desde el mac, que es lo que quiero hacer, no funciona.
Por extraño que parezca, la prueba para iniciar la sincronización desde la máquina Linux genera este extraño mensaje:
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]
incluyendo, tenga en cuenta, la afirmación muy extraña [server=2.6.9]
, aunque he actualizado a 3.1.1 en Mac. Por algunas razones, parece que mi máquina Linux 've' solo la versión rsync original en la Mac.
¿Alguna sugerencia sobre cómo resolver esto?
ACTUALIZACIÓN 23 de octubre : según la excelente sugerencia de @Lee Johnson (ver más abajo), iniciar la sincronización desde el servidor Linux ahora funciona. Para completar, ahora he probado todas las combinaciones, y surge un patrón interesante:
EN MAC:
OBRAS: archivos de Mac a Linux
FALLOS: archivos de Linux a Mac
EN LINUX
OBRAS: archivos de Linux a Mac
FALLOS: archivos de Mac a Linux
En otras palabras, la --iconv
opción parece funcionar solo de una manera, con archivos desde la máquina local al remoto, no al revés. A mí me parece un error, pero ¿tal vez así se supone que funcione?
¿Alguien capaz de compartir luz sobre esto?
rsync
(por ejemplo, de homebrew) en el mac y se llama desde Linux, es necesario especificar la ruta correcta usando--rsync-path="/usr/local/bin/rsync"
.DS_Store
de las sincronizaciones y debido a esto OSX no pudo eliminar directorios con estos archivos dentro. Configuré los juegos de caracteres con--iconv
, la ruta rsync en el mac con--rsync-path
(estoy usando homebrew), y luego tuve que agregar--delete-excluded
para que los tercos directorios pudieran eliminarse.Respuestas:
Después de mucho experimentar, y mucho debido a las útiles sugerencias de @Lee Johnson, finalmente descubrí la solución, que ahora me parece vergonzosamente obvia. Debido a un comentario que leí al investigar el problema, pensé que se suponía que especificabas el conjunto de caracteres en el orden de transformación; pero parece que esa no es la sintaxis correcta. Más bien, uno debería
SIEMPRE uso
--iconv=utf-8-mac,utf-8
al inicializar el rsync desde la mac, y SIEMPRE uso--iconv=utf-8,utf-8-mac
al inicializar el rsync desde la máquina Linux, no importa si quiero sincronizar archivos desde la máquina Mac o Linux.¡Entonces funciona como magia!
fuente
¿Recientemente actualizaste a OS X Yosemite? Tuve el mismo problema, antes de recordar que había actualizado / usr / bin / rsync con la versión 3.1. Cuando actualicé a Yosemite, esto fue reemplazado con la versión anterior 2.6.9.
En mi propio caso, arreglé el problema en Mac volviendo a vincular mi 3.1 rsync nuevamente en / usr / bin:
fuente
--iconv
sea compatible con 2.6.9; incluso si rsync solo envía la opción al host remoto para su manejo, debe reconocer la opción en el lado de OS X. ¿Quéwhich rsync; rsync --version
te dice, desde un terminal OS X?--rsync-path=/opt/local/bin/rsync
obtener su versión 3.1.1 conocida en el lado de Mac?