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

29

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

Eu tenho um utilitário de backup que usa o rsync . Quero dizer 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

Obviamente, a ferramenta pode ser pronta ou uma idéia para um script python.

Muito Obrigado!

Udi

Adam Matan
fonte

Respostas:

18

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

brianegge
fonte
9

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

Eu queria:

  • Para comparar o mesmo sistema de arquivos consigo, ou seja, instantâneo , faça alterações , instantâneo , compare .
  • Uma lista de quais arquivos foram adicionados ou removidos não se importava com as alterações internas dos 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 os binários padrão do sistema. Compará-lo com base no conteúdo pode ser feito passando findum -execparâmetro que ecoou o caminho do arquivo e um MD5 depois disso.

Camilo Martin
fonte
8

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 o find em um loop for. Além disso, você pode aumentar consideravelmente a saída do diff, para dizer coisas como "esse arquivo está no host1, mas não no host2" ou algo parecido, mas, nesse momento, você também pode instalar as ferramentas de que todo mundo está falando ...

chris
fonte
5

Eu usei dirdiff no passado para comparar estruturas de diretório. Ele funciona apenas em diretórios locais, assim você terá que sshfsmontar seus outros diretórios.

O bom é que você pode ver visualmente se os arquivos são iguais ou não e qual é o mais novo ou mais antigo. E suporta até 5 diretórios. Você também pode ver diferenças e copiar arquivos de um para o outro.

chmeee
fonte
4

Na página de manual do rsync:

-n, --dry-run
This  makes rsync perform a trial run that doesn’t make any changes (and produces mostly
the same output as a real run).  It is most commonly used in combination  with  the  -v,
--verbose  and/or -i, --itemize-changes options to see what an rsync command is going to
do before one actually runs it.

Pode ser que isso ajude.

Saurabh Barjatiya
fonte
Obrigado, mas não resolve o meu problema (estou procurando o diff para realmente dizer as diferenças).
14119 Adam Matan
4

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

AlexB
fonte
1
-rsignifica recursivo, ele não se conecta a um host remoto!
Michael Hampton
3

Eu usaria Meld para isso.

pupeno
fonte
O Meld funciona muito bem para isso, se você quiser uma solução GUI.
de Drew Noakes
2

Além das ferramentas já mencionadas no Windows, você pode usar o Total Commander ou o WinSCP, ambos possuem funções muito confortáveis ​​para comparar (e sincronizar) diretórios.


fonte
0

Eu realmente não queria instalar nada de novo, então minha solução é um pouco grosseira, mas rápida e eficaz.

Eu queria comparar todos os arquivos que foram copiados e seu modo de arquivo, propriedade e contexto de segurança do SELinux permanecem sem troca.

Então eu corri:

rsync -aX /orig /copy/

e então compare assim:

cd /orig && ls -lZR > /tmp/diff_orig
cd /copy && ls -lZR > /tmp/diff_copy
vimdiff /tmp/diff_*

Se o conteúdo de ambos os arquivos permanecer recolhido, eles serão idênticos. Caso contrário, o diff é mostrado.

Atualize os parâmetros de lspara refletir os atributos que você precisa verificar. YMMV

helvete
fonte