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?
Respostas:
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-only
diz "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 B
ontem, mas tenha se esquecido de preservar os carimbos de hora e agora deseja fazer a operação ao contráriorsync 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-only
pode ser seu amigo neste caso (módulo do exemplo acima).--ignore-times
diz 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émtouch
fez com que o arquivo corrigido tivesse o mesmo tempo de modificação do arquivo original - digamos que você seja furtivo assim. Bem--ignore-times
irá fazer uma comparação dos arquivos , embora o tamanho e tempo de jogo.fonte
A resposta curta é que
--ignore-times
faz mais do que seu nome indica. Ele ignora tanto o tempo e tamanho. Em contraste,--size-only
faz exatamente o que diz.A resposta longa é que
rsync
existem três maneiras de decidir se um arquivo está desatualizado: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,
rsync
usa apenas 1 e 2. Ambos 1 e 2 podem ser adquiridos juntos por um únicostat
, 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.fonte
Você está perdendo que o rsync também pode comparar arquivos por checksum.
--size-only
significa 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-times
significa 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.fonte
Em um sistema Scientific Linux 6.7, a página do manual em rsync diz:
Tenho dois arquivos com conteúdos idênticos, mas com datas de criação diferentes:
Com
--size-only
, os dois arquivos são considerados iguais:Com
--ignore-times
, os dois arquivos são considerados diferentes:Portanto, não parece
--ignore-times
ter nenhum efeito.fonte
--ignore-times
teria copiado os arquivos mesmo que seus carimbos de data / hora fossem os mesmos.