Rsync con archivos de caracteres especiales no funciona entre Mac y Linux

Rsync con archivos de caracteres especiales no funciona entre Mac y Linux

Quiero usar rsync para hacer una copia de seguridad de mi servidor Ubuntu con un disco que reside en una Mac. Pero no consigo que funcione correctamente, ya que cada vez que vuelvo a ejecutar la operación rsync después de la inicial, los archivos con caracteres especiales primero se eliminan y luego se vuelven a sincronizar. Parece que hay un problema con los diferentes conjuntos de caracteres.

Elsolución preferidaparece ser utilizar la --iconvopción:

Puedes usar la opción --iconv de rsync para convertir entre UTF-8 NFC y NFD, al menos si estás en una Mac. Hay un conjunto de caracteres especial utf-8-mac que significa UTF-8 NFD. Entonces, para copiar archivos desde su Mac a su NAS, necesitará 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.

Gracias a @Jan, yoactualicé mi versión de rsync en mi macdesde 2.6.9. a 3.1.1. Aún así, todavía no he llegado a ese punto, ya que ahora recibo otro 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 entiendo por qué "la acción solicitada no es compatible", ya que parece que la versión rsync en mi Ubuntu (12.04) es posterior a 3.xx y, por lo tanto, debería admitir la --iconvopción.

EDITAR: Permítanme agregar que cuando yo (en Mac, nota bene) inicio un rsync DESDE Mac A Linux, todo funciona espléndidamente:

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

Pero ir al revés desde Mac no funciona. Por extraño que parezca, al probar para iniciar rsync desde la máquina Linux se muestra 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]

incluido el reclamo muy extraño [server=2.6.9], aunque actualicé a 3.1.1 en Mac. Por algunas razones, parece que mi máquina Linux "ve" sólo la versión original de rsync en Mac.

¿Alguna sugerencia sobre cómo solucionar esto?

Respuesta1

La solución fue vergonzosamente simple: en gran parte debido a un comentario que leí mientras investigaba el problema, pensé que se suponía que debías especificar el conjunto de caracteres en el orden de transformación; pero parece que esa no es la sintaxis correcta. Más bien, uno deberíasiempreutilizar --iconv=utf-8-mac,utf-8al inicializar el rsync desde el mac, ysiempreutilícelo --iconv=utf-8,utf-8-macal inicializar rsync desde la máquina Linux, sin importar si quiero sincronizar archivos desde la máquina Mac o Linux.

¡Entonces funciona como magia!

EDITAR: De hecho, a veces, es bueno consultar detenidamente la página del manual. Aquí está, negro sobre blanco:

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

Respuesta2

Puedo confirmar que esto funciona, estaba teniendo el mismo problema. En mi caso, cualquier archivo con un carácter acentuado era ilegible en el destino. Solo lo descubrí ejecutando una comparación de carpetas en mi Mac usando la aplicación Comparar carpetas: https://itunes.apple.com/gb/app/compare-folders/id816042486?mt=12

Se agregó lo anterior --iconv=utf-8-mac,utf-8 y BOOM! rsync reemplazó cada archivo acentuado por uno nuevo.

Para agregar información, ya que parece que los enlaces anteriores ya no funcionan, para actualizar rsync a 3.1.2, instale Macports y ejecute: sudo port install rsync

La razón por la que estaba viendo que el servidor remoto devolvía la versión 2.6.9 es porque la versión anterior todavía está ahí y el servidor remoto está viendo esa en lugar de la nueva.

La versión 2.6.9 se encuentra en /usr/bin

información relacionada