Como o rsync decide exatamente o que sincronizar?

14

Estou encontrando várias respostas para a pergunta, então queria perguntar às pessoas que realmente a usam, em vez de apenas criar o maior blog, preenchendo informações aleatórias semi-inúteis.

Cenário: eu rsync -av --progress /dir/a /dir/b e ele faz as coisas.

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

Eu adiciono novos arquivos para / dir / a e renomeio alguns arquivos em / dir / b, e talvez alguns também sejam excluídos.

Se eu correr rsync -av --progress /dir/a /dir/bnovamente, o que será copiado? Apenas os novos arquivos porque sabem o que foram copiados anteriormente ou os arquivos que foram renomeados / excluídos também, porque não estão mais presentes.

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

No momento, fico feliz em verificar as coisas manualmente, mas à medida que os dados aumentam, vou precisar de mais automação para executar esta tarefa.

SPooKYiNeSS
fonte
3
A -ibandeira é muito útil. Para cada arquivo, ele dá uma seqüência de jogo que pode ser decodificado para ver porque ele combinava (bandeira para o tempo de modificação, bandeira para o tamanho, etc.)
BowlOfRed

Respostas:

17

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

Não, ele não sabe o que fez em uma execução anterior. Ele compara os dados do lado receptor com os dados a serem enviados. Com dados pequenos o suficiente, isso não será aparente, mas quando você possui diretórios grandes o suficiente, o tempo gasto comparando antes do início da cópia é facilmente sentido.

A verificação padrão é para horários e tamanhos de modificação de arquivo. 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 usadas. -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
muru
fonte
A melhor descrição que eu já vi (até agora), obrigado #
SPooKYiNeSS
2
Uma pequena adição. Arquivos renomeados são tratados como arquivos exclusivos em cada extremidade. A especificação de --fuzzyuma vez os reconhecerá como iguais no mesmo diretório. O uso --fuzzyduas vezes expande esse recurso para outros locais. Veja man rsyncpara detalhes. Obviamente, uma das principais razões para o uso rsyncé a capacidade de copiar apenas as partes de um arquivo que foram alteradas. Isso pode tornar as transferências pela rede muito mais rápidas. BTW, a opção de soma de verificação é mencionada acima para explicar como rsyncfunciona. Na maioria dos casos, não deve ser usado.
Joe
6

Geral

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

Dicas

  • Use a opção -n'execução a seco', para verificar o que acontece antes de executar sua rsynclinha de comando.

  • Observe o significado especial de uma barra 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
    

    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 -ue eu não conheço nenhuma opção norsync para corrigir isso facilmente, se você quiser mantê-lo no diretório de origem.

Mas você pode removê-lo do diretório de origem ou colocar o nome do arquivo no arquivo excludede usar a opção --exclude-from=excluded(para muitos arquivos) ou simplesmente --exclude=PATTERNpara 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)

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

sudodus
fonte
Bons exemplos obrigado. Eu sabia o / no final, só estou perguntando isso no aplicativo e o perdi (e você pode ver claramente que eu apenas copiei / postei)
SPooKYiNeSS
E, novamente, ele é enviado antes de terminar e não me permite editar meu comentário ... Copiei / colei o segundo. Vou dar uma olhada unuson e ver se ele pode fazer o que eu quero, e se não eu vou voltar para o plano b e apenas fazer um script
SPooKYiNeSS
Uso unison-gtkhá vários anos e estou feliz com isso. (Eu rsynctambém uso .)
sudodus
1

Ele copia apenas os novos arquivos em / dir / a. O que você fizer 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. 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 / ae depois sincronizar novamente com / dir / b? Eu não acho que exista uma maneira de impedir que o rsync copie os arquivos novamente nesse caso.

Hermann Ingjaldsson
fonte
Eu não esperava que houvesse uma maneira, além de usar um atributo para determinar, mas se estivesse criando um script infantil e teria mais necessidade. Obrigado pela sua resposta, pelo menos agora eu sei o que preciso fazer.
SPooKYiNeSS