Como eu faço um diff binário em dois arquivos de tamanho idêntico no Linux?

37

Eu tenho dois arquivos de tamanhos idênticos e preciso fazer um diff binário para verificar se são os mesmos.

Atualmente, estou executando runnnig diff file1.img file2.img , mas demora um pouco para processar meus arquivos de 4 GB. Essa é a maneira mais eficiente de fazer isso?

    
por Jon Cage 29.04.2010 / 14:03

5 respostas

16

Encontrei uma solução - a ferramenta cmp que vem com a maioria dos sabores do Linux.

    
por 29.04.2010 / 14:11
44

cmp foi projetado para encontrar diferenças em arquivos binários. Você também pode tentar a soma de verificação ( sum ) e comparar os hashes.

    
por 29.04.2010 / 14:12
20

Uma das formas mais comuns de determinar se dois arquivos são idênticos (assumindo que os tamanhos deles correspondem) está usando um programa para criar uma " hash "(essencialmente uma impressão digital) de um arquivo. Os mais comuns são md5sum e sha1sum .

Por exemplo:

$ md5sum file1 file2
e0e7485b678a538c2815132de7f9e878  file1
4a14aace18d472709ccae3910af55955  file2

Se você tiver muitos arquivos que precisa verificar, por exemplo, se estiver transferindo um diretório cheio de arquivos de um sistema para outro, poderá redirecionar a saída do sistema original para um arquivo e, em seguida, md5sum / sha1sum pode usar esse arquivo automaticamente para informar quais arquivos são diferentes:

$ md5sum file1 file2 > MD5SUMS
... copy file1, file2, MD5SUMS across
$ md5sum --check MD5SUMS
file1: OK
file2: OK
    
por 29.04.2010 / 14:21
3

Se eu quiser saber se são iguais, prefiro usar o sha1sum se estiver disponível, ou md5 como alternativa.

Se eu quiser saber o quão diferente eles são, ou onde eles são diferentes, uma coisa que funciona é ativá-los através de od ('octal dump', que geralmente tem uma opção hexadecimal) para criar arquivos temporários e depois diferenciá-los.

    
por 29.04.2010 / 14:34
1

Acabei de executar alguns testes de desempenho em um arquivo com mais de 100 MB. diff foi o mais rápido, enquanto o cmp ficou em segundo lugar, e o md5sum ficou em último lugar.

# time diff file1 file2; echo $?

real    0m0.122s
user    0m0.009s
sys 0m0.113s
0
# time cmp file1 file2; echo $?

real    0m0.213s
user    0m0.097s
sys     0m0.117s
0
# time md5sum file1 > /tmp/test; time md5sum file2 > /tmp/test2; diff /tmp/test /tmp/test2; echo $?

real    0m0.279s
user    0m0.211s
sys     0m0.066s

real    0m0.316s
user    0m0.225s
sys     0m0.073s
0

Eu reran o exercício com um arquivo de 4,3 GB e tive que excluir e recriar o arquivo com dd, já que o cache de RAM estava afetando muito os resultados.

$time diff file1 file2; echo $?

real    0m19.325s
user    0m0.995s
sys 0m5.280s
0

$time cmp file1 file2; echo $?

real    0m36.106s
user    0m4.399s
sys 0m6.147s
0

$time md5sum file1 > /tmp/test; time md5sum file2 > /tmp/test2; diff /tmp/test /tmp/test2; echo $?

real    0m10.441s
user    0m8.054s
sys 0m2.357s

real    0m24.682s
user    0m8.027s
sys 0m3.442s
0

Com base nesses resultados, eu recomendaria mover os arquivos para uma montagem RAMFS e continuar com o diff.

    
por 26.06.2017 / 20:29

Tags