Melhor maneira de comparar (diff) uma estrutura de diretórios completa?

Melhor maneira de comparar (diff) uma estrutura de diretórios completa?

Qual é a melhor maneira de comparar estruturas de diretórios?

Eu tenho um utilitário de backup que usasincronizar novamente. Quero informar as diferenças exatas (em termos de tamanhos de arquivo e datas da última alteração) entre a origem e o backup.

Algo como:

Local file                   Remote file                         Compare
/home/udi/1.txt (date)(size)   /home/udi/1.txt (date)(size)     EQUAL
/home/udi/2.txt (date)(size)   /home/udi/2.txt (date)(size)     DIFFERENT

Claro, a ferramenta pode estar pronta ou ser uma ideia para um script python.

Muito obrigado!

Udi

Responder1

A ferramenta que você procura érdiff. Funciona como combinar rsync e diff. Ele cria um arquivo de patch que você pode comparar ou distribuir.

Responder2

Algumas pessoas querem comparar sistemas de arquivos por diferentes motivos, então vou escrever aqui o que queria e como fiz.

Eu queria:

  • Para comparar omesmo sistema de arquivosconsigo mesmo, ou seja,instantâneo,faça mudanças,instantâneo,comparar.
  • Uma lista de quais arquivos foram adicionados ou removidos, não se importava com alterações internas de arquivos.

O que eu fiz:

Primeiro instantâneo ( before.shscript):

find / -xdev | sort > fs-before.txt

Segundo instantâneo ( after.shscript):

find / -xdev | sort > fs-after.txt

Para compará-los ( diff.shscript):

diff -daU 0 fs-before.txt fs-after.txt | grep -vE '^(@@|\+\+\+|---)'

A parte boa é que isso usa praticamente binários de sistema padrão. A comparação com base no conteúdo poderia ser feita passando findum -execparâmetro que ecoasse o caminho do arquivo e um MD5 depois disso.

Responder3

se você não quiser instalar outra ferramenta ...

for host in host1 host2
do
  ssh $host ' 
  cd /dir &&
  find . |
  while
    read line
  do
    ls -l "$line"
  done ' | sort  > /tmp/temp.$host.$$
done
diff /tmp/temp.*.$$ | less
echo "don't forget to clean up the temp files!"

E sim, isso poderia ser feito com find e exec ou find e xargs tão facilmente quanto find em um loop for. E, também, você pode aumentar a saída do diff para que ele diga coisas como "este arquivo está no host1, mas não no host2" ou algo assim, mas nesse ponto você pode simplesmente instalar as ferramentas das quais todo mundo está falando.

Responder4

diff -rna verdade funciona muito bem. Se você quiser apenas saber se os arquivos são diferentes, e não o conteúdo real das diferenças, façadiff -qr

informação relacionada