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 --iconv
opçã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 --iconv
opçã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?
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"
.DS_Store
das 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-excluded
para que os diretórios teimosos pudessem ser excluídos.Respostas:
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-8
ao inicializar o rsync a partir do mac e SEMPRE use--iconv=utf-8,utf-8-mac
ao 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!
fonte
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:
fonte
--iconv
seja 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 quewhich rsync; rsync --version
diz a você, de um terminal OS X?--rsync-path=/opt/local/bin/rsync
colocar sua versão 3.1.1 conhecida no lado do Mac?