Como exatamente o rsync decide o que sincronizar?

12

Eu estou encontrando várias respostas para a pergunta, por isso queria perguntar às pessoas que realmente usam, em vez de apenas querer fazer o maior blog, preenchendo com informações semi inúteis aleatórias.

Cenário: eu %código% e faz a sua coisa.

Eu adiciono novos arquivos a / dir / a e executo o mesmo comando novamente, ele sabe o que ele fez e copia apenas os novos arquivos.

Eu adiciono novos arquivos em / dir / a e renomeio alguns arquivos em / dir / b, e talvez exclua alguns também.

Se eu executar rsync -av --progress /dir/a /dir/b novamente, o que será copiado? Apenas os novos arquivos, porque ele sabe o que foi copiado anteriormente, ou os arquivos que foram renomeados / excluídos também, porque eles não estão mais presentes.

E como bônus, se os arquivos copiados anteriormente forem copiados novamente, existe uma maneira de evitar isso, de modo que somente novas adições a / dir / a sejam copiadas?

No momento, estou feliz verificando as coisas manualmente, mas conforme os dados ficarem maiores, precisarei de mais automação para realizar essa tarefa.

    
por SPooKYiNeSS 29.10.2017 / 14:59

3 respostas

16
  

Eu adiciono novos arquivos em / dir / a e executo o mesmo comando novamente, ele sabe o que ele faz e copia apenas os novos arquivos.

Não, não sabe o que aconteceu em uma execução anterior. Compara os dados no lado de recebimento com os dados a serem enviados. Com dados pequenos o suficiente, isso não será aparente, mas quando você tem diretórios grandes o suficiente, o tempo gasto comparando antes que a cópia realmente comece é facilmente percebido.

A verificação padrão é para tempos e tamanhos de modificação de arquivos. De man rsync :

-c, --checksum
      This changes the way rsync checks if the files have been changed
      and  are in need of a transfer.  Without this option, rsync uses
      a "quick check" that (by default) checks if each file’s size and
      time of last modification match between the sender and receiver.
      This option changes this to compare a 128-bit checksum for  each
      file  that  has a matching size.  Generating the checksums means
      that both sides will expend a lot of disk I/O  reading  all  the
      data  in  the  files  in  the transfer (and this is prior to any
      reading that will be done to transfer changed  files),  so  this
      can slow things down significantly.

E:

-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.)

Observe que isso não está implícito nas opções que você usou. -a é:

-a, --archive               archive mode; same as -rlptgoD (no -H)
-r, --recursive             recurse into directories
-l, --links                 copy symlinks as symlinks
-p, --perms                 preserve permissions
-o, --owner                 preserve owner (super-user only)
-g, --group                 preserve group
    --devices               preserve device files (super-user only)
    --specials              preserve special files
-D                          same as --devices --specials
-t, --times                 preserve times
    
por muru 29.10.2017 / 15:40
4

Geral

Se eu entendi corretamente, rsync -av não tem memória, então copiará os arquivos que foram renomeados / excluídos também, porque eles estão presentes na origem, mas não estão mais presentes no destino.

Dicas

  • Use a opção -n , 'dry run', para verificar o que acontece antes de executar sua linha de comando rsync .

  • Observe o significado especial de uma barra final após o diretório de origem e veja a diferença entre

    rsync -av --progress dir/a/ dir/b
    

    e

    rsync -av --progress dir/a dir/b
    

    , que é descrito no manual man rsync .

Exemplo

Seu caso especial (adicionar um arquivo ao diretório de origem 'a' e remover um arquivo do diretório de destino 'b') adicionará o arquivo adicionado e o arquivo copiado anteriormente, porque ele ainda está no diretório de origem. Isso acontecerá com e sem a opção -u e não conheço nenhuma opção em rsync para corrigir isso facilmente, se você quiser mantê-la no diretório de origem.

Mas você pode removê-lo do diretório de origem ou colocar o nome do arquivo no arquivo excluded e usar a opção --exclude-from=excluded (para muitos arquivos) ou simplesmente --exclude=PATTERN para um ou alguns arquivos.

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-2

sent 103 bytes  received 25 bytes  256.00 bytes/sec
total size is 13  speedup is 0.10 (DRY RUN)

$ rsync -av --progress dir/a/ dir/b
sending incremental file list
./
file-1
              6 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/3)
file-2
              7 100%    6.84kB/s    0:00:00 (xfr#2, to-chk=0/3)

sent 196 bytes  received 57 bytes  506.00 bytes/sec
total size is 13  speedup is 0.05

$ echo textx-3>./dir/a/file-3

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 121 bytes  received 22 bytes  286.00 bytes/sec
total size is 21  speedup is 0.15 (DRY RUN)

$ rm dir/b/file-1 
rm: ta bort normal fil 'dir/b/file-1'? y

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --exclude=file-1 --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 104 bytes  received 22 bytes  252.00 bytes/sec
total size is 15  speedup is 0.12 (DRY RUN)

Alternativa: unison

Você pode testar a ferramenta unison , que é uma ferramenta de sincronização . Ele fornece um método visual para identificar casos especiais e decidir o que fazer. Existe uma versão da GUI ( unison-gtk ).

    
por sudodus 29.10.2017 / 15:57
1

Apenas copia os novos arquivos em / dir / a. O que quer que você faça em / dir / b será ignorado, a menos que você use a opção --delete. Nesse caso, os arquivos renomeados em / dir / b serão excluídos. Isso forçará / dir / b a se tornar exatamente como / dir / a.

Sobre o bônus, você quer dizer como no caso de renomear arquivos em / dir / a, e então rsyncing para / dir / b? Eu não acho que haja uma maneira de impedir que o rsync apenas copie os arquivos novamente nesse caso.

    
por Hermann Ingjaldsson 29.10.2017 / 15:24

Tags