Conversión de nombres de archivo UTF-8 NFD a UTF-8 NFC, en rsync o afpd


24

Tengo un servidor de archivos de inicio que ejecuta FreeNAS 8. Hace unos días, utilicé rsync para cargar toda mi biblioteca de iTunes desde Mac para poder cargar mi biblioteca a través de la red en lugar de hacerlo desde una unidad USB lenta. Esto funcionó principalmente, e iTunes funciona mucho mejor ahora, pero me encuentro con problemas para acceder a cualquier canción que contenga caracteres no ASCII (noté el problema al cargar pistas de Queensrÿche). Los archivos aparecerían en el Finder, pero cualquier intento de acceder a ellos los hizo desaparecer hasta que me volví a conectar al servidor.

Después de algunas investigaciones descubrí que esto se debe a que OSX usa un orden de caracteres UTF diferente al de Linux. Los sistemas de archivos OSX usan la Forma de normalización Unicode D (NFD), donde Linux usa la Forma C (NFC). Rsync no convierte estos formularios cuando realiza la copia desde mi Mac al servidor, ahora cuando iTunes intenta acceder a un archivo con un carácter especial a través de la red, los archivos en el servidor tienen la codificación incorrecta y los informes de AFPD no lo hacen ' t existe.

¿Cuál es la mejor manera de abordar este problema? ¿Es posible hacer que rsync realice la conversión unicode mientras carga la biblioteca base al servidor? ¿Puedo configurar afpd para transmitir / recibir nombres de archivo en formato NFD? ¿Existe una solución fácil para cambiar los nombres de archivo en el servidor? Encontré algunas cosas sobre un programa llamado convmv, pero no sé si puedo ejecutarlo en FreeNAS.


1
Suena como un error con la versión OS X de rsync.
Ignacio Vazquez-Abrams

Respuestas:


4

Nota: Si está utilizando la versión 3.0.0 o posterior de rsync, la --iconvopción mencionada en las otras respuestas es claramente la solución superior.

Algo que debería funcionar es la sincronización entre el directorio de origen y el sistema de archivos remoto montado (SMB, NFS, AFP), que rsync solo tratará como un sistema de archivos local.

Sin embargo, no sé qué tan bien funciona esto en la práctica, y tiene que trabajar en torno a diferentes problemas, por ejemplo, el algoritmo de transferencia delta no se usará de forma predeterminada (ya que el origen y el destino son "locales") (tal vez - ¿no funcionará todo el archivo?), debe verificar, por ejemplo, que SMB preserva efectivamente los tiempos de modificación, etc.


Esto es lo que finalmente terminé haciendo. Eliminé toda la colección del NAS y volví a ejecutar rsync, usando la conexión CIFS montada localmente en lugar del demonio rsync en el NAS. Ahora solo estoy solucionando problemas de iTunes desde la capitalización del nombre de archivo. : /
ChiperSoft

50

Puede usar la --iconvopción de rsync para convertir entre UTF-8 NFC y NFD, al menos si está en una Mac. Hay un utf-8-macconjunto de caracteres 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.


1
No soy el Cartel original, así que no depende de mí, pero esta es una solución mucho más limpia y eficiente que la marcada como aceptada. Protagonizar esto con seguridad, será muy útil.
ItsGC

1
Gran respuesta; No tenía idea de que UTF8-MACsignifica NFD; cuando se usa consigo iconvmismo, proporciona un mecanismo genérico para traducir de ida y vuelta entre NFC y NFD.
Mklement

gran respuesta, ¡esto resuelve un problema de larga data en sincronizar una mac con un servidor Linux!
Meduz

2
En Mac también puede necesitarbrew tap homebrew/dupes && brew install homebrew/dupes/rsync && rehash
SaveTheRbtz el

Obtengorsync: --iconv: unknown option
KMC

7

Actualmente estoy usando rsync --iconvasí:

Copiar archivos del servidor Linux a la máquina OS X

Debe ejecutar este comando desde la máquina OS X :

rsync -a --delete --iconv=UTF-8-MAC,UTF-8 'username@server.ip.address.here:/home/username/path/on/server/' /Users/username/path/on/machine/

Copiar archivos de la máquina OS X al servidor Linux

Debe ejecutar este comando desde la máquina OS X :

rsync -a --delete --iconv=UTF-8-MAC,UTF-8 /Users/username/path/on/machine/ 'username@server.ip.address.here:/home/username/path/on/server/'

0

No use rsync para copiar los archivos a su NAS. Cuando usa rsync para copiar los archivos, los nombres de los archivos se almacenarán en su NAS en formato UTF NFD (es decir, el formato OSX), pero el servidor Samba que se ejecuta en su NAS solo entiende los nombres de archivos en formato UTF NFC. Use la interfaz CIFS / SMB (Samba) para copiar los archivos y todo estará bien.


0

Desde mi experiencia, recomiendo usar SMB en lugar de ssh. Iconv resuelve el problema con la codificación, pero todavía hay problemas con los caracteres permitidos en diferentes sistemas:

Nombre de archivo original en Mac:

https-//img-9gag-fun.9cache.com/photo/adK9jzN_460s

Después de copiar por rsync sobre SMB:

-as seen by Mac (over SMB):     https-//img-9gag-fun.9cache.com/photo/adK9jzN_460s
-as seen by Ubuntu (over SMB):  https-img-9gag-fun.9cache.comphotoadK9jzN_460s
-as seen by Windows10 (over SMB):   https-∀∀img-9gag-fun.9cache.com∀photo∀adK9jzN_460s
-as seen by Ubuntu server locally:  https-img-9gag-fun.9cache.comphotoadK9jzN_460s

Después de copiar por rsync sobre ssh (con hormiga sin bandera iconv):

-as seen by Mac (over SMB):     H0INHQ~6
-as seen by Ubuntu (over SMB):  H0INHQ~6
-as seen by Windows10 (over SMB):   H0INHQ~6
-as seen by Ubuntu server locally:  https-::img-9gag-fun.9cache.com:photo:adK9jzN_460s
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.