No Ubuntu, quero copiar um arquivo grande do meu disco rígido para um disco removível por rsync
. Por algum outro motivo, a operação não pode ser concluída em uma única execução. Então, estou tentando descobrir como usar rsync
para continuar copiando o arquivo de onde parou da última vez.
Tentei usar a opção --partial
Ou --inplace
, Mas junto com --progress
, Encontrei rsync
com --partial
Ou --inplace
Começa do começo ao invés do que restou da última vez. Parar manualmente rsync
cedo e verificar o tamanho do arquivo recebido também confirmou o que encontrei.
Mas com --append
, O rsync começa com o que restou da última vez.
Estou confuso como vi na página de manual--partial
, --inplace
E --append
Parecem estar relacionados à retomada da cópia do que restou da última vez . Alguém é capaz de explicar a diferença? Por que --partial
Ou --inplace
Funcionam para retomar a cópia? É verdade que, para retomar a cópia, rsync
precisa trabalhar com a opção --append
?
Além disso, se um arquivo parcial foi deixado por mv
ou cp
, não pelo rsync, rsync --append
Continuará a copiar corretamente o arquivo?
Para retomar uma cópia interrompida, você deve usar rsync --append
. Na explicação da página de manual sobre --append
:
Isso faz com que o rsync atualize um arquivo anexando dados ao final do arquivo, o que presume que os dados que já existem no lado de recebimento sejam idênticos ao início do arquivo no lado de envio. [ ...] implica
--inplace
, [...]
Opção --inplace
faz com que rsync
(over) escreva diretamente o conteúdo do arquivo de destino; sem--inplace
, rsync
:
O modo normal de operação evita principalmente conflitos com aplicativos que podem ter o arquivo de destino aberto e alguns outros contratempos devidamente listados na página de manual rsync
.
Observe que, se uma operação de cópia/atualização falhar nas etapas 1.-3. acima, rsync
excluirá o arquivo de destino temporário; a --partial
opção desativa esse comportamento e rsync
deixará arquivos temporários parcialmente transferidos no sistema de arquivos de destino. Portanto, retomar uma operação de cópia de arquivo único não ganhará muito, a menos que você tenha chamado o primeiro rsync
com --partial
ou --partial-dir
(o mesmo efeito que --partial
, além disso instrui rsync
para criar todos os arquivos temporários em um diretório específico).
Esteja ciente que --append
implica --inplace
, o que implica --partial
.
Apenas usando --partial
você deve fazer com que rsync
deixe transferências parciais e retome-as nas tentativas subseqüentes.
Usando --append
você deve fazer com que rsync
deixe os arquivos parciais e os retome da próxima vez. Após a transferência, rsync
deve verificar apenas a soma de verificação dos dados transmitidos.
--append-verify
inclui o arquivo inteiro na verificação da soma de verificação, incluindo qualquer parte transferida em uma transferência anterior.
Com --append
ou --append-verify
uma falha na verificação da soma de verificação deve fazer com que o arquivo seja retransmitido completamente (usando --inplace
)
Você deve poder retomar uma operação mv
ou cp
com rsync
, mas poderá usar o --append-verify
opção de paz de espírito.
Observe que usando --append
faz com que rsync
copie apenas os arquivos cujo tamanho no receptor seja menor que o tamanho no remetente (independentemente do tempo selos) ou estão ausentes no receptor. Pela documentação desta opção:
Se um arquivo precisar ser transferido e seu tamanho no receptor for igual ou maior que o tamanho no remetente, o arquivo será ignorado.
Mais informações na página de manual
David Schwartz está correto, --partial
(ou melhor, -P
) faz o que você quer. Eu verifiquei isso em um arquivo 37G que foi parado ~ 8g nele, em uma rede. O rsync examinou rapidamente as primeiras partes da parcial (mostrando o progresso que estava acontecendo graças a -P
) e retomou a transferência para o final do arquivo parcial.
Você estava fazendo certo --partial
faz o que você quer. Parece estar começando do início, porque sempre começa no início da lista de blocos de dados de arquivo que ele precisa copiar. O --append
opção é perigosa e resultará em um arquivo corrompido se os dados não corresponderem por algum motivo.
Por padrão, rsync
ativará --whole-file
se estiver transferindo do disco local para o disco local. Isso reiniciará uma transferência interrompida desde o início, em vez de verificar as partes que já estão lá.
Para desativar isso, use:
--no-whole-file
Combinando isso com --inplace
ou --partial
permitirá retomar a transferência posteriormente.
Meu alias para usar rsync
para copiar é:
rscp='rsync -ax --inplace --sparse --no-whole-file --protect-args'
Aviso: tenha cuidado ao usar --append-verify
como será pular qualquer arquivo de destino que seja do mesmo tamanho ou maior.