Convertendo nomes de arquivos UTF-8 NFD em UTF-8 NFC, em rsync ou afpd

24

Eu tenho um servidor de arquivos doméstico executando o FreeNAS 8. Alguns dias atrás, usei o rsync para carregar toda a minha biblioteca do iTunes do Mac, para que eu pudesse carregar minha biblioteca pela rede em vez de uma unidade USB lenta. Isso funcionou principalmente, e o iTunes funciona muito melhor agora, mas estou tendo problemas para acessar todas as músicas que possuem caracteres não-ascii (notei o problema ao carregar faixas do Queensrÿche). Os arquivos apareceriam no Finder, mas qualquer tentativa de acessá-los os fazia desaparecer até eu me reconectar ao servidor.

Após algumas pesquisas, descobri que isso ocorre porque o OSX usa uma ordem de caracteres UTF diferente do Linux. Os sistemas de arquivos OSX usam o Unicode Normalization Form D (NFD), onde o linux usa o Form C (NFC). O Rsync não converte esses formulários quando executa a cópia do meu mac para o servidor. Agora, quando o iTunes tenta acessar um arquivo com um caractere especial pela rede, os arquivos no servidor têm a codificação incorreta e os relatórios AFPD que não possuem. não existe.

Qual é a melhor maneira de resolver esse problema? É possível fazer com que o rsync execute a conversão unicode enquanto carrega a biblioteca base no servidor? Posso configurar o afpd para transmitir / receber nomes de arquivos no formato NFD? Existe uma solução fácil para alterar os nomes de arquivos no servidor? Encontrei algumas coisas sobre um programa chamado convmv, mas não sei se posso executá-lo no FreeNAS.

ChiperSoft
fonte
1
Parece um bug com a versão OS X do rsync.
Ignacio Vazquez-Abrams

Respostas:

4

Nota: Se você estiver usando a versão 3.0.0 ou mais recente do rsync, a --iconvopção mencionada nas outras respostas é claramente a solução superior.

Algo que deve funcionar é o sincronismo entre o diretório de origem e o sistema de arquivos remoto montado (SMB, NFS, AFP), que o rsync tratará apenas como sistema de arquivos local.

No entanto, eu não sei o quão bem isso funciona na prática, e você precisa solucionar problemas diferentes, por exemplo, o algoritmo delta-transfer não será usado por padrão (já que a origem e o destino são "locais") (talvez - nenhum arquivo inteiro funcionará?), você deve verificar, por exemplo, se o SMB preserva efetivamente os tempos de modificação, etc.

LCC
fonte
Isso foi o que acabei fazendo. Excluí toda a coleção do NAS e executei o rsync novamente, usando a conexão CIFS montada localmente em vez do daemon rsync no NAS. Agora estou apenas corrigindo problemas do itunes da capitalização de nome de arquivo. : /
ChiperSoft
50

Você pode usar a --iconvopção do rsync para converter entre UTF-8 NFC e NFD, pelo menos se estiver em um Mac. Há um utf-8-macconjunto de caracteres especiais que significa UTF-8 NFD. Portanto, para copiar arquivos do seu Mac para o NAS, você precisa executar algo como:

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

Isso converterá todos os nomes de arquivos locais de UTF-8 NFD para UTF-8 NFC no servidor remoto. O conteúdo dos arquivos não será afetado.

Lennart L
fonte
1
Eu não sou o Pôster original, então não cabe a mim, mas esta é uma solução muito mais limpa e eficiente do que a que foi sinalizada como aceita. Com isso, com certeza, será muito útil.
ItsGC
1
Ótima resposta; Eu não tinha ideia de que UTF8-MACsignifica NFD; quando usado iconvsozinho, isso fornece um mecanismo genérico para a conversão entre NFC e NFD.
mklement
ótima resposta, isso resolve um problema de longa data em sincronizar um mac com um servidor linux!
meduz
2
No Mac você também pode precisarbrew tap homebrew/dupes && brew install homebrew/dupes/rsync && rehash
SaveTheRbtz
Eu receborsync: --iconv: unknown option
KMC
7

Atualmente estou usando rsync --iconvassim:

Copiando arquivos do servidor Linux para a máquina OS X

Você deve executar este comando na máquina OS X :

rsync -a --delete --iconv=UTF-8-MAC,UTF-8 '[email protected]:/home/username/path/on/server/' /Users/username/path/on/machine/

Copiando arquivos da máquina OS X para o servidor Linux

Você deve executar este comando na máquina OS X :

rsync -a --delete --iconv=UTF-8-MAC,UTF-8 /Users/username/path/on/machine/ '[email protected]:/home/username/path/on/server/'
Envek
fonte
0

Não use o rsync para copiar os arquivos para o seu NAS. Quando você usa o rsync para copiar os arquivos, os nomes dos arquivos serão armazenados no seu NAS no formato UTF NFD (ou seja, o formato OSX), mas o servidor Samba em execução no seu NAS entende apenas os nomes de arquivos no formato UTF NFC. Use a interface CIFS / SMB (Samba) para copiar os arquivos e tudo ficará bem.

por que eu
fonte
0

Da minha experiência, eu recomendo usar SMB em vez de ssh. Iconv resolve problemas com a codificação, mas ainda há problemas com caracteres permitidos em sistemas diferentes:

Nome do arquivo original no Mac:

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

Após 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

Após copiar por rsync sobre ssh (com ant sem flag 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
lukdz
fonte