Quero usar o rsync para fazer backup do meu servidor Ubuntu com um disco residente em um Mac. Mas não consigo que funcione corretamente, pois toda vez que executo novamente a operação rsync após o tempo inicial, os arquivos com caracteres especiais são primeiro excluídos e depois sincronizados novamente. Parece que há um problema com diferentes conjuntos de caracteres.
Osolução preferidaparece ser usar a --iconv
opção:
Você pode usar a opção --iconv do rsync para converter entre UTF-8 NFC e NFD, pelo menos se estiver em um Mac. Existe um conjunto especial de caracteres utf-8-mac que significa UTF-8 NFD. Portanto, para copiar arquivos do seu Mac para o NAS, você precisará 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.
Graças a @Jan, euatualizei minha versão rsync no meu macde 2.6.9. para 3.1.1. Mesmo assim, ainda não cheguei lá, pois agora recebo mais 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]
Não consigo entender por que "a ação solicitada não é suportada", já que parece que a versão rsync no meu Ubuntu (12.04) é posterior a 3.xx e, portanto, deve suportar a --iconv
opção.
EDIT: Deixe-me acrescentar que quando eu (no Mac, note bem) inicio um rsync DO Mac PARA Linux, tudo funciona esplendidamente:
rsync -av --delete --iconv=utf-8-mac,utf-8 localdir/ mynas:remotedir/
Mas ir para o outro lado do Mac não funciona. Estranhamente, testar para iniciar o rsync a partir da máquina Linux gera esta 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 a afirmação muito estranha [server=2.6.9]
, embora eu tenha atualizado para 3.1.1 no Mac. Por alguns motivos, parece que minha máquina Linux 'vê' apenas a versão original do rsync no Mac.
Alguma sugestão sobre como resolver isso?
Responder1
A solução foi embaraçosamente simples: muito devido a um comentário que li ao pesquisar o problema, pensei que você deveria especificar o conjunto de caracteres na ordem de transformação; mas parece que essa não é a sintaxe correta. Em vez disso, deve-sesempreusar --iconv=utf-8-mac,utf-8
ao inicializar o rsync do mac, esempreuso --iconv=utf-8,utf-8-mac
ao inicializar o rsync da máquina Linux, não importa se eu quero sincronizar arquivos da máquina Mac ou Linux.
Então funciona como mágica!
EDITAR: Na verdade, às vezes, verificar atentamente a página de manual é uma boa coisa a fazer. Aqui está, preto no branco:
--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.
Responder2
Posso confirmar que funciona, eu estava tendo o mesmo problema. No meu caso, qualquer arquivo com caractere acentuado era ilegível no destino. Só descobri isso executando uma comparação de pastas no meu Mac usando o aplicativo Compare Folders: https://itunes.apple.com/gb/app/compare-folders/id816042486?mt=12
Adicionado acima --iconv=utf-8-mac,utf-8 e BOOM! O rsync substituiu todos os arquivos acentuados por um novo.
Para adicionar algumas informações, pois parece que os links acima não funcionam mais, para atualizar o rsync para 3.1.2, instale o Macports e execute: sudo port install rsync
A razão pela qual você estava vendo o servidor remoto retornando a versão 2.6.9 é porque a versão antiga ainda está lá e o servidor remoto está vendo aquela em vez da nova.
A versão 2.6.9 está localizada em /usr/bin