Eu costumava rsync
copiar um grande número de arquivos, mas meu sistema operacional (Ubuntu) reiniciou inesperadamente.
Após a reinicialização, corri rsync
novamente, mas a partir da saída no terminal, descobri que rsync
ainda havia copiado os que já haviam sido copiados anteriormente. Mas ouvi dizer que rsync
é capaz de encontrar diferenças entre origem e destino e, portanto, apenas copiar as diferenças. Então, eu me pergunto no meu caso se rsync
pode retomar o que restou da última vez?
sudo rsync -azvv /home/path/folder1/ /home/path/folder2
. (3) A origem e o destino são NTFS, a fonte de compra é um disco rígido externo e o destino é um disco rígido interno. (3) Agora está em execução e ainda não terminou.--modify-window
opção ajuda nisso).Respostas:
Primeiro, em relação à parte "resume" da sua pergunta,
--partial
apenas informa ao terminal de recebimento que mantenha os arquivos parcialmente transferidos se o terminal de envio desaparecer como se tivesse sido completamente transferido.Durante a transferência de arquivos, eles são salvos temporariamente como arquivos ocultos em suas pastas de destino (por exemplo
.TheFileYouAreSending.lRWzDC
) ou em uma pasta escolhida especificamente se você definir a--partial-dir
opção. Quando uma transferência falha e--partial
não está definida, esse arquivo oculto permanecerá na pasta de destino com esse nome criptográfico, mas, se--partial
estiver definido, o arquivo será renomeado para o nome real do arquivo de destino (nesse casoTheFileYouAreSending
), mesmo que o arquivo não está completo. O ponto é que você pode concluir a transferência posteriormente executando o rsync novamente com--append
ou--append-verify
.Portanto,
--partial
ele próprio não retoma uma transferência com falha ou cancelada. Para retomar, você precisará usar um dos sinalizadores acima mencionados na próxima execução. Portanto, se você precisar garantir que o destino nunca contenha arquivos que parecem estar bem, mas estão incompletos, não use--partial
. Por outro lado, se você quiser ter certeza de que nunca deixa para trás arquivos com falha perdidos que estão ocultos no diretório de destino e sabe que poderá concluir a transferência posteriormente,--partial
existe para ajudá-lo.No que diz respeito à
--append
opção mencionada acima, esta é a opção "resumir" real, e você pode usá-la independentemente de também estar usando--partial
. Na verdade, quando você está usando--append
, nenhum arquivo temporário é criado. Os arquivos são gravados diretamente em seus destinos. Nesse sentido,--append
fornece o mesmo resultado que--partial
em uma transferência com falha, mas sem criar esses arquivos temporários ocultos.Portanto, para resumir, se você estiver movendo arquivos grandes e desejar a opção de retomar uma operação rsync cancelada ou com falha a partir do ponto exato em que
rsync
parou, será necessário usar--append
ou--append-verify
ativar a próxima tentativa.Como o @Alex aponta abaixo, desde a versão 3.0.0
rsync
agora existe uma nova opção--append-verify
, que se comporta como--append
antes da troca. Você provavelmente sempre quer o comportamento de--append-verify
, então verifique sua versão comrsync --version
. Se você estiver em um Mac e não usandorsync
a partirhomebrew
, você (pelo menos até e incluindo El Capitan) tem uma versão mais antiga e precisa usar--append
, em vez de--append-verify
. Por que eles não mantiveram o comportamento--append
e, em vez disso, nomearam o recém--append-no-verify
- chegado é um pouco intrigante. De qualquer maneira,--append
arsync
versão anterior à 3 é igual--append-verify
à das versões mais recentes.--append-verify
não é perigoso: ele sempre lê e compara os dados nas duas extremidades e não apenas assume que são iguais. Ele faz isso usando somas de verificação, para facilitar a rede, mas exige a leitura da quantidade compartilhada de dados nas duas extremidades da conexão antes que possa realmente retomar a transferência anexando ao destino.Segundo, você disse que "ouviu dizer que o rsync é capaz de encontrar diferenças entre a origem e o destino e, portanto, apenas copiar as diferenças".
Está correto e é chamado de transferência delta, mas é uma coisa diferente. Para habilitar isso, você adiciona a opção
-c
ou--checksum
. Depois que essa opção é usada, o rsync examinará os arquivos existentes nas duas extremidades do fio. Ele faz isso em partes, compara as somas de verificação nas duas extremidades e, se elas diferem, transfere apenas as diferentes partes do arquivo. Mas, como @Jonathan aponta abaixo, a comparação é feita apenas quando os arquivos têm o mesmo tamanho nas duas extremidades - tamanhos diferentes farão com que o rsync carregue o arquivo inteiro, substituindo o destino com o mesmo nome.Isso requer um pouco de computação nas duas extremidades inicialmente, mas pode ser extremamente eficiente na redução da carga de rede se, por exemplo, você estiver frequentemente fazendo backup de arquivos muito grandes, arquivos de tamanho fixo, que geralmente contêm pequenas alterações. Exemplos que vêm à mente são os arquivos de imagem de disco rígido virtual usados em máquinas virtuais ou destinos iSCSI.
É notável que, se você usar
--checksum
para transferir um lote de arquivos completamente novos para o sistema de destino, o rsync ainda calculará suas somas de verificação no sistema de origem antes de transferi-las. Porque eu não sei :)Então, resumindo:
Se você está sempre usando rsync apenas "mover coisas de A para B" e querem a opção de cancelar essa operação e depois retomá-la, não usar
--checksum
, mas não utilizar--append-verify
.Se você estiver usando o rsync para fazer backup frequentemente,
--append-verify
provavelmente não fará muito por você, a menos que você tenha o hábito de enviar arquivos grandes que aumentam de tamanho continuamente, mas que raramente são modificados uma vez gravados. Como uma dica de bônus, se você estiver fazendo backup de um armazenamento compatível com snapshots comobtrfs
ouzfs
, adicionar a--inplace
opção ajudará a reduzir o tamanho dos snapshots, já que os arquivos alterados não são recriados, mas os blocos alterados são gravados diretamente sobre os antigos. Essa opção também é útil se você desejar evitar o rsync criar cópias de arquivos no destino quando ocorrerem apenas pequenas alterações.Ao usar
--append-verify
, o rsync se comportará como sempre acontece em todos os arquivos do mesmo tamanho. Se diferirem na modificação ou em outros registros de data e hora, ele substituirá o destino pela fonte sem examinar esses arquivos ainda mais.--checksum
comparará o conteúdo (soma de verificação) de cada par de arquivos com nome e tamanho idênticos.ATUALIZADO 01/09/2015 Alterado para refletir os pontos feitos por @Alex (obrigado!)
ATUALIZADO 14/07/2017 Alterado para refletir os pontos feitos por @Jonathan (obrigado!)
fonte
--partial
é suficiente.--partial-dir
- parece que é a bala perfeita para isso. Talvez eu tenha perdido alguma coisa inteiramente;)--partial
: o rsync copia o arquivo para o nome temporário, a conexão é interrompida, o rsync remoto eventualmente move o arquivo para o nome normal e fecha, depois fecha reexecutando com--partial
e sem--append
, o novo arquivo temporário é inicializado com uma cópia do arquivo remoto parcialmente transferido e a cópia continua de onde a conexão morreu. (Ubuntu 14.04 / rsync 3.1)--checksum
? De acordo com o documentoman
, tem mais a ver com a decisão de quais arquivos sinalizar para transferência do que com a transferência delta (que, presumivelmente, érsync
o comportamento padrão do site).TL; DR:
Basta especificar um diretório parcial, conforme recomendado pelas páginas de manual do rsync:
Explicação mais longa:
Há realmente um recurso built-in para fazer isso usando a
--partial-dir
opção, que tem várias vantagens sobre o--partial
e--append-verify
/--append
alternativa.Trecho das páginas de manual do rsync:
Por padrão, o rsync usa um nome de arquivo temporário aleatório que é excluído quando uma transferência falha. Como mencionado,
--partial
você pode fazer com que o rsync mantenha o arquivo incompleto como se fosse transferido com êxito , para que seja possível anexá-lo posteriormente usando as opções--append-verify
/--append
. No entanto, existem várias razões pelas quais isso é sub-ideal.Seus arquivos de backup podem não estar completos e, sem verificar o arquivo remoto que ainda deve estar inalterado, não há como saber.
Se você está tentando usar
--backup
e--backup-dir
acabou de adicionar uma nova versão deste arquivo que nunca saiu antes no seu histórico de versões.No entanto, se usarmos
--partial-dir
, o rsync preservará o arquivo parcial temporário e continuará o download usando esse arquivo parcial na próxima vez que você o executar, e não sofreremos os problemas acima.fonte
Você pode adicionar a
-P
opção ao seu comando.Na
man
página:Então, em vez de:
Faz:
Obviamente, se você não quiser as atualizações de progresso, basta usar
--partial
, ou seja:fonte
rsync
. É importante ressaltar, no entanto, que--partial
ele próprio não retoma uma transferência com falha. Veja a minha resposta para mais detalhes :)-P
suficiente no meu caso. Versões: o cliente possui 3.1.0 e o servidor 3.1.1. Interrompi a transferência de um único arquivo grande com ctrl-c. Acho que estou perdendo alguma coisa.vv
? ou seja,v
usado 2 vezes?-azvvP
?Eu acho que você está ligando à força
rsync
e, portanto, todos os dados estão sendo baixados quando você se lembra novamente. use a--progress
opção para copiar apenas os arquivos que não foram copiados e a--delete
opção para excluir os arquivos, se já tiverem sido copiados e agora ele não existe na pasta de origem ...Se você estiver usando ssh para efetuar login em outro sistema e copiar os arquivos,
deixe-me saber se há algum erro na minha compreensão deste conceito ...
fonte
--delete
excluirá arquivos no destino que não existem na fonte. O menos sério é que--progress
não modifica como as coisas são copiadas; apenas fornece um relatório de progresso de cada arquivo que ele copia. (I corrigido o erro grave; substituiu-o com--remove-source-files
.)Eu estou usando esse script simples. Sinta-se à vontade para ajustar certos sinalizadores e / ou configurá-los.
fonte
Chegando tarde para isso, mas eu tinha a mesma pergunta e encontrei uma resposta diferente.
O
--partial
sinalizador ("manter arquivos parcialmente transferidos"rsync -h
) é útil para arquivos grandes, como é--append
("acrescenta dados a arquivos mais curtos"), mas a questão é sobre um grande número de arquivos.Para evitar arquivos que já foram copiados, use
-u
(ou--update
: "pule arquivos mais recentes no receptor").fonte