rsync: diferença entre --size-only e --ignore-times

114

Estou tentando entender qual é a diferença entre duas opções

rsync --size-only

e

rsync --ignore-times

É meu entendimento que, por padrão, o rsync irá comparar os carimbos de data / hora e os tamanhos dos arquivos para decidir se um arquivo deve ou não ser sincronizado ou não. As opções acima permitem que o usuário influencie esse comportamento.

Ambas as opções parecem, pelo menos verbalmente, resultar na mesma coisa: comparar apenas por tamanho .

Estou perdendo algo sutil aqui?

alfred_j_kwack
fonte
18
Isso provavelmente se encaixaria melhor em algo como SuperUser.com ou Unix.SE , já que se trata de usar uma ferramenta existente (não relacionada à programação) em vez de qualquer coisa diretamente relacionada à escrita de código.
Jerry Coffin

Respostas:

110

O rsync compara arquivos de várias maneiras - a fonte oficial é a descrição do algoritmo rsync: https://www.andrew.cmu.edu/course/15-749/READINGS/required/cas/tridgell96.pdf . O artigo da wikipedia sobre rsync também é muito bom.

Para arquivos locais, o rsync compara os metadados e, se parecer que não precisa copiar o arquivo, porque o tamanho e o carimbo de data / hora correspondem entre a origem e o destino, ele não procura mais. Se eles não corresponderem, é o arquivo cp. No entanto, e se os metadados corresponderem, mas os arquivos não forem realmente os mesmos? Então o rsync provavelmente não fez o que você pretendia.

Arquivos com o mesmo tamanho ainda podem ter sido alterados. Um exemplo simples é um arquivo de texto onde você corrige um erro de digitação - como alterar "teh" para "the". O tamanho do arquivo é o mesmo, mas o arquivo corrigido terá um carimbo de data / hora mais recente. --size-onlydiz "não olhe para a hora; se o tamanho corresponder, presuma que os arquivos correspondem", o que seria a escolha errada neste caso.

Por outro lado, suponha que você acidentalmente tenha feito um grande cp -r A Bontem, mas tenha se esquecido de preservar os carimbos de hora e agora deseja fazer a operação ao contrário rsync B A. Todos os arquivos que você copiou têm a data e hora de ontem, embora não tenham sido realmente modificados ontem, e o rsync irá, por padrão, copiar todos esses arquivos e atualizar a data e hora para ontem também. --size-onlypode ser seu amigo neste caso (módulo do exemplo acima).

--ignore-timesdiz para comparar os arquivos independentemente de os arquivos terem o mesmo tempo de modificação. Considere o exemplo de erro de digitação acima, mas você não apenas corrigiu o erro de digitação, mas também touchfez com que o arquivo corrigido tivesse o mesmo tempo de modificação do arquivo original - digamos que você seja furtivo assim. Bem --ignore-timesirá fazer uma comparação dos arquivos , embora o tamanho e tempo de jogo.

ckg
fonte
58

A resposta curta é que --ignore-timesfaz mais do que seu nome indica. Ele ignora tanto o tempo e tamanho. Em contraste, --size-onlyfaz exatamente o que diz.


A resposta longa é que rsyncexistem três maneiras de decidir se um arquivo está desatualizado:

  1. Compare o tamanho da origem e do destino.
  2. Compare o carimbo de data / hora da origem e do destino.
  3. Compare a soma de verificação estática da origem e do destino.

Essas verificações são realizadas antes de transferir os dados. Notavelmente, isso significa que a soma de verificação estática é diferente da soma de verificação do fluxo - a última é calculada durante a transferência de dados.

Por padrão, rsyncusa apenas 1 e 2. Ambos 1 e 2 podem ser adquiridos juntos por um único stat, enquanto 3 requer a leitura de todo o arquivo (isso é independente da leitura do arquivo para transferência). Supondo que apenas um modificador seja especificado, isso significa o seguinte:

  • Ao usar --size-only, apenas 1 é executado - carimbos de data / hora e soma de verificação são ignorados. Um arquivo é copiado, a menos que seu tamanho seja idêntico em ambas as extremidades.

  • Ao usar --ignore-times, nenhum dos 1, 2 ou 3 é executado. Um arquivo sempre é copiado.

  • Ao usar --checksum, 3 é usado além de 1, mas 2 não é executado. Um arquivo é copiado, a menos que o tamanho e a soma de verificação correspondam. A soma de verificação só é calculada se o tamanho corresponder.

MisterMiyagi
fonte
1
--checksum é exatamente o que eu estava procurando. Eu estava copiando a saída do build que só tinha a mudança de horário para a maioria dos arquivos. Adicionar --checksum significava ignorar as diferenças de tempo, mas garantiu que fossem idênticas, bit a bit. Era o que eu esperava --ignore-times para fazer, obrigado por informações adicionais.
Joseph Connolly
50

Você está perdendo que o rsync também pode comparar arquivos por checksum.

--size-onlysignifica que o rsync irá ignorar os arquivos de tamanho correspondente, mesmo se os carimbos de data / hora forem diferentes. Isso significa que ele sincronizará menos arquivos do que o comportamento padrão. Irá perder qualquer arquivo com alterações que não afetam o tamanho geral do arquivo. Se você tem algo que altera as datas dos arquivos sem alterar os arquivos e não quer que o rsync gaste muito tempo fazendo a soma de verificação desses arquivos para descobrir que eles não foram alterados, esta é a opção a ser usada.

--ignore-timessignifica que o rsync fará a soma de verificação de cada arquivo, mesmo se os carimbos de data / hora e os tamanhos dos arquivos corresponderem. Isso significa que ele sincronizará mais arquivos do que o comportamento padrão. Isso incluirá alterações nos arquivos mesmo quando o tamanho do arquivo for o mesmo e a data / hora da modificação tiver sido redefinida para o valor original. A soma de verificação de cada arquivo significa que ele deve ser inteiramente lido do disco, o que pode ser lento. Alguns pipelines de construção redefinirão os timestamps para uma data específica (como 1970-01-01) para garantir que o arquivo de construção final seja reproduzível bit por bit, por exemplo, quando compactado em um arquivo tar que salva os timestamps.

rjmunro
fonte
4
"redefinir a data / hora é improvável de ser feito na prática, mas pode acontecer" - Por exemplo, ao usar um software que, em nome de compilações reproduzíveis, redefine forçosamente cada arquivo para 01/01/1970 em vez da data e hora da criação / modificação real.
10
Na verdade, acho que você precisa da opção -c se quiser que as somas de verificação sejam usadas. Sem ele, --ignore-times irá copiar todos os arquivos incondicionalmente.
Edward Falk
1
A opção -a pode substituir essas opções. No meu caso, eu estava usando --compare-dir = e --size-only e obtendo resultados inesperados. Alterar -a para -r resolveu o problema.
dbagnara
@dbagnara Eu confirmei hoje que --size-only "fica em cima de" -a, ou "substitui" -a. Eu tinha uma unidade que, por qualquer motivo, estava montada com todos os tempos de modificação aumentados em um mês. Rsync para backup estava copiando todos os arquivos (com -a ON). Adicionar --size-only corrigiu o problema e levou aos resultados desejados (então -a --size-only). Portanto, concluo que apenas o tamanho substitui o arquivo.
Tommy
1

Em um sistema Scientific Linux 6.7, a página do manual em rsync diz:

--ignore-times          don't skip files that match size and time

Tenho dois arquivos com conteúdos idênticos, mas com datas de criação diferentes:

[root@windstorm ~]# ls -ls /tmp/master/usercron /tmp/new/usercron
4 -rwxrwx--- 1 root root 1595 Feb 15 03:45 /tmp/master/usercron
4 -rwxrwx--- 1 root root 1595 Feb 16 04:52 /tmp/new/usercron

[root@windstorm ~]# diff /tmp/master/usercron /tmp/new/usercron
[root@windstorm ~]# md5sum /tmp/master/usercron /tmp/new/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/master/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/new/usercron

Com --size-only , os dois arquivos são considerados iguais:

[root@windstorm ~]# rsync -v --size-only -n  /tmp/new/usercron /tmp/master/usercron

sent 29 bytes  received 12 bytes  82.00 bytes/sec
total size is 1595  speedup is 38.90 (DRY RUN)

Com --ignore-times , os dois arquivos são considerados diferentes:

[root@windstorm ~]# rsync -v --ignore-times -n  /tmp/new/usercron /tmp/master/usercron
usercron

sent 32 bytes  received 15 bytes  94.00 bytes/sec
total size is 1595  speedup is 33.94 (DRY RUN)

Portanto, não parece --ignore-timester nenhum efeito.

Peter Chiu
fonte
2
--ignore-timesteria copiado os arquivos mesmo que seus carimbos de data / hora fossem os mesmos.
MisterMiyagi