Opção rsync --iconv no Mac não funciona (sincronização do servidor Linux remoto para o Mac local)

9

Eu quero usar o rsync para fazer backup de dados de um servidor Linux remoto para o meu Mac local. E eu quero inicializar esta operação no meu Mac local. Tudo funciona bem, exceto que há um problema de caractere especial: toda vez que executo a operação rsync (após a sincronização inicial), os arquivos com caracteres especiais são primeiro excluídos e depois sincronizados novamente. Tanto quanto eu entendo, há um problema com diferentes conjuntos de caracteres, e a solução preferida parece ser usar a --iconvopção:

Você pode usar a opção --iconv do rsync para converter entre NFC e NFD UTF-8, pelo menos se estiver em um Mac. Há um conjunto de caracteres utf-8-mac especial 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.

O problema é que isso só funciona 'de uma maneira' para mim, ou seja, ao sincronizar do Mac para o Linux. Mas eu quero 'ir para o outro lado', ou seja, sincronizar da máquina linux para o Mac. E quero inicializar a operação no meu Mac local. Mas quando eu tento:

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

Eu recebo um erro:

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]

Estou sem entender por que isso não funciona. Minha versão do rsync no Mac é atualizada a partir da 2.6.9. a 3.1.1. usando Macports . Observe que a operação funciona quando eu (no Mac, nota bene) inicio um rsync do Mac para o Linux:

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

Mas seguir o outro caminho 'do mac - que é o que eu quero fazer - não funciona.

Curiosamente, o teste para iniciar a sincronização a partir da máquina linux gera essa mensagem estranha:

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]

incluindo, observe, a alegação muito estranha [server=2.6.9], embora eu tenha atualizado para a 3.1.1 no Mac. Por algumas razões, parece que minha máquina linux 'vê' apenas a versão rsync original no Mac.

Alguma sugestão sobre como resolver isso?

ATUALIZAÇÃO 23 de outubro : Por excelente sugestão de @Lee Johnson (veja abaixo), iniciar a sincronização a partir do servidor linux agora funciona. Para completar, já tentei todas as combinações e surge um padrão interessante:

NO MAC:

OBRAS: Arquivos do Mac para o Linux

FAILS: Arquivos do Linux para Mac

NO LINUX

OBRAS: Arquivos do Linux para Mac

FAILS: Arquivos do Mac para o Linux

Em outras palavras, a --iconvopção parece funcionar apenas de uma maneira, com arquivos da máquina local para o controle remoto, e não o contrário. Parece um bug para mim, mas talvez seja assim que Deveria funcionar?

Alguém pode compartilhar luz sobre isso?

Nick The Swede
fonte
1
ao usar um costume rsync(por exemplo, de homebrew) no mac e chamá-lo de linux, é necessário especificar o caminho correto usando--rsync-path="/usr/local/bin/rsync"
meduz
Eu estava excluindo .DS_Storedas sincronizações e, por causa disso, o OSX não pôde excluir diretórios com esses arquivos. Eu configurei os conjuntos de caracteres com --iconv, o caminho rsync no mac com --rsync-path(eu estou usando homebrew) e, em seguida, tive que adicionar --delete-excludedpara que os diretórios teimosos pudessem ser excluídos.
Daniel

Respostas:

12

Depois de muitas experiências, e muito devido às sugestões úteis de @Lee Johnson, finalmente descobri a solução, que agora me parece embaraçosamente óbvia. Muito devido a um comentário que li ao pesquisar o problema, pensei que você deveria especificar o conjunto de caracteres na ordem da transformação; mas parece que essa não é a sintaxe correta. Pelo contrário, deve-se

SEMPRE use --iconv=utf-8-mac,utf-8ao inicializar o rsync a partir do mac e SEMPRE use --iconv=utf-8,utf-8-macao inicializar o rsync a partir da máquina linux, não importa se eu quero sincronizar arquivos da máquina mac ou linux.

Então funciona como mágica!

Nick The Swede
fonte
O UTF8-MAC é um pseudo-conjunto de caracteres e não está disponível por si só com o iconvlib em um sistema Linux, mesmo que não com a versão mais recente da 3.1.1 no Ubuntu 14.04 LTS. Isso não está funcionando se você tentar iniciar a sincronização no Linux.
Achim Lammerts
5

Você atualizou recentemente para o OS X Yosemite? Eu tive o mesmo problema, antes de lembrar que havia atualizado / usr / bin / rsync com a versão 3.1. Quando atualizei para o Yosemite, isso foi substituído pela versão 2.6.9 antiga.

No meu caso, consertei o problema no Mac, vinculando novamente meu rsync 3.1 em / usr / bin:

sudo -s
cd /usr/bin
mv rsync rsync-2.6.9
ln -s /usr/local/bin/rsync .
exit
Lee Johnson
fonte
Graças a um milhão, isso resolve o mistério do motivo pelo qual obtive esse 2.6.9. mensagem. (No meu Mac, porém, a versão instalada do Macport está em / opt / local / bin / rsync, mas a alteração do link para esse esporte funcionou como mágica.) Infelizmente, eu quero inicializar a sincronização da minha máquina MAC, portanto isso só ajuda até onde eu entendo que minha máquina Linux pode descobrir o que fazer. Então, por que não funciona quando inicializado no meu Mac? Ou seja, as mnas "rsync -av --delete --iconv = utf-8, utf-8-mac: remotedir / localdir /"
Nick The Swede
Permitam-me também dizer que, infelizmente, tenho uma reputação muito baixa para poder marcar sua resposta com +1 e, como ela ainda não funciona da maneira que eu quero, não posso marcar como resolvida. Estrela de ouro em minha mente, em qualquer caso (e prometo voltar e marcar +1 com você assim que meu representante ultrapassar os 15)!
Nick The Swede
Você está dizendo que ainda não funciona do lado do OS X, mesmo com o rsync 3.x em execução? Eu não acho que isso --iconvseja suportado no 2.6.9; mesmo que o rsync esteja apenas enviando a opção para o host remoto para manipulação, ele precisa reconhecer a opção no lado do OS X. O que which rsync; rsync --versiondiz a você, de um terminal OS X?
Lee Johnson
Está correto. Como você pode ver na mensagem de erro (terceira citação cinza na pergunta), ele reconhece que estou usando o 3.1 no mac: [Receiver = 3.1.1] e afirma que a ação não é suportada, embora evidentemente funcione do lado do Linux, bem como quando sincronizo, do Mac, arquivos no mac para o servidor linux. Mas a partir do mac, os arquivos do linux para o mac não funcionam. Tão estranho (pelo menos para os meus olhos noob).
Nick The Swede
2
Quando você está tentando fazer isso no Linux, o que acontece se você forçar o caminho do executável com algo como --rsync-path=/opt/local/bin/rsynccolocar sua versão 3.1.1 conhecida no lado do Mac?
Lee Johnson