La opción rsync --iconv en Mac no funciona (sincronización del servidor remoto de Linux a la Mac local)

9

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 --iconvopció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 --iconvopció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?

Nick el sueco
fuente
1
cuando se usa una costumbre 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"
meduz
Estaba excluyendo .DS_Storede 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-excludedpara que los tercos directorios pudieran eliminarse.
Daniel

Respuestas:

12

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-8al inicializar el rsync desde la mac, y SIEMPRE uso --iconv=utf-8,utf-8-macal 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!

Nick el sueco
fuente
UTF8-MAC es un pseudo-juego de caracteres y no está disponible per se con iconvlib en un sistema Linux, incluso no con la última versión 3.1.1 en Ubuntu 14.04 LTS. Eso no funciona si intenta iniciar la sincronización en Linux.
Achim Lammerts
5

¿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:

sudo -s
cd /usr/bin
mv rsync rsync-2.6.9
ln -s /usr/local/bin/rsync .
exit
Lee Johnson
fuente
Un millón de gracias, eso resuelve el misterio de por qué obtuve ese 2.6.9. mensaje. (Sin embargo, en mi Mac, la versión instalada de Macport está en / opt / local / bin / rsync, pero cambiar el enlace a ese deporte funcionó mágicamente). Desafortunadamente, quiero inicializar la sincronización desde mi máquina MAC, por lo que esto solo ayuda yo hasta el punto de entender que mi máquina Linux puede averiguar qué hacer. Entonces, ¿por qué no funciona cuando se inicializa desde mi Mac? Es decir, el "rsync -av --delete --iconv = utf-8, utf-8-mac mynas: remotedir / localdir /"
Nick The Swede
Permítanme decir también que desafortunadamente tengo una reputación demasiado baja para poder hacer +1 en su respuesta útil, y dado que todavía no funciona de la manera que quiero, no puedo marcarlo como resuelto. ¡Estrella dorada en mi mente, en cualquier caso (y prometo volver y hacer +1 en cuanto mi representante llegue a más de 15)!
Nick The Swede
¿Estás diciendo que todavía no funciona desde el lado de OS X, incluso con rsync 3.x ejecutándose? No creo que --iconvsea ​​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 --versionte dice, desde un terminal OS X?
Lee Johnson el
Eso es correcto. Como puede ver en el mensaje de error (tercera cita gris en la pregunta), reconoce que estoy usando 3.1 en el mac: [Receiver = 3.1.1], y afirma que la acción no es compatible, aunque evidentemente funciona desde el lado de Linux, así como cuando sincronizo, desde la Mac, archivos en la Mac al servidor Linux. Pero desde Mac, los archivos de Linux a Mac no funcionan. Tan extraño (al menos para mis ojos novatos).
Nick The Swede
2
Cuando intenta esto desde Linux, ¿qué sucede si fuerza la ruta ejecutable con algo como --rsync-path=/opt/local/bin/rsyncobtener su versión 3.1.1 conocida en el lado de Mac?
Lee Johnson