Por que o rsync tenta copiar o arquivo que já está atualizado?

22

Eu tenho dois arquivos iguais, na máquina local e na remota. Seus tamanhos são iguais e o arquivo na máquina local é mais recente do que no remoto - mas o rsync ainda tenta copiar o arquivo.

Eu invoco o rsync da seguinte forma:

rsync -nv -e "ssh -p 2222" user@host:/data/file.fif data/file.fif

(se eu não usar a opção -n , inicia a operação de cópia)

Os documentos do Rsync afirmam explicitamente que isso não deveria acontecer:

Rsync  finds files that need to be transferred using a "quick check" algorithm (by default) that looks for files that have changed in size or in last-modified time.

Saídas de stat :

# remote file
  File: 'data/fif/Skovorodko_Olga_45_raw.fif'
  Size: 1137551966  Blocks: 2221784    IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 286338      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1037/  platon)   Gid: ( 1047/  platon)
Access: 2013-08-08 18:40:16.907581658 +0400
Modify: 2013-07-16 12:01:09.158763284 +0400
Change: 2013-07-16 12:01:09.158763284 +0400

# local file
  File: 'data/fif/Skovorodko_Olga_45_raw.fif'
  Size: 1137551966  Blocks: 2221792    IO Block: 4096   regular file
Device: 801h/2049d  Inode: 12987232    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1005/  platon)   Gid: ( 1003/  platon)
Access: 2013-08-08 19:02:57.146223369 +0400
Modify: 2013-08-08 19:02:57.146223369 +0400
Change: 2013-08-08 19:02:57.146223369 +0400

Por que isso acontece?

ATUALIZAÇÃO:

Fazendo o arquivo de resultados rsync --size-only não ser copiado:

delta-transmission enabled
Skovorodko_Olga_45_raw.fif is uptodate
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 14 bytes  received 114 bytes  85.33 bytes/sec
total size is 1137551966  speedup is 8887124.73 (DRY RUN)
    
por Rogach 08.08.2013 / 17:22

1 resposta

28

O algoritmo de verificação rápida considerará como modificado qualquer arquivo que tenha horário de modificação diferente ou tamanho diferente. Portanto, se o seu diretório de destino tiver uma versão mais recente do mesmo arquivo, ele será considerado diferente e será sincronizado com a versão de origem.

Esse é o comportamento esperado (e mais seguro). Por exemplo, vamos supor que você tenha dois diretórios, ~ / src e ~ / dest, cada um com um arquivo foobar. Em ~ / src / foobar você escreve "foo", e depois em ~ / dest / foobar você escreve "bar". Agora você rsync ~ / src para ~ / dest. O que você esperaria?

Ambos os arquivos têm o mesmo tamanho, mas o de ~ / dest é mais novo. O comportamento padrão do Rsync é substituir ~ / dest / foobar por ~ / src / foobar. É claro, os arquivos podem ser idênticos e seriam desnecessários, mas não há como saber isso, a menos que você faça uma soma de verificação ou compare um bit por bit.

Se você não quiser esse comportamento, ou seja, quiser que arquivos mais recentes no receptor sejam preservados, você terá que usar o sinalizador -u (--update).

-u, --update This forces rsync to skip any files which exist on the destination and have a modified time that is newer than the source file. (If an existing destination file has a modification time equal to the source file’s, it will be updated if the sizes are different.)

    
por 08.08.2013 / 18:26

Tags