Como faço uma comparação binária em dois arquivos de tamanho idêntico no Linux?

37

Eu tenho dois arquivos de tamanho idêntico e preciso fazer uma comparação binária para verificar se são iguais.

Atualmente, estou executando, diff file1.img file2.imgmas está demorando um pouco para processar meus arquivos de 4 GB. Essa é a maneira mais eficiente de fazer isso?

Jon Cage
fonte

Respostas:

45

cmpfoi desenvolvido para encontrar diferenças nos arquivos binários. Você também pode tentar checksumming ( sum) e comparar os hashes.

mpez0
fonte
21

Uma das maneiras mais comuns de determinar se dois arquivos são idênticos (supondo que seus tamanhos correspondam) é usar um programa para criar um " hash " (essencialmente uma impressão digital) de um arquivo. Os mais comuns são md5sume 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, então md5sum/ sha1sumpoderá usá-lo automaticamente para informar você quais arquivos são diferentes:

$ md5sum file1 file2 > MD5SUMS
... copy file1, file2, MD5SUMS across
$ md5sum --check MD5SUMS
file1: OK
file2: OK
Adam Batkin
fonte
2
O MD5 nem sempre é confiável para isso: digg.com/security/…
Jon Cage
28
Na verdade, o MD5 é confiável para verificações básicas de integridade. Simplesmente não é considerado tão criptograficamente forte como pensávamos antes. Se você está preocupado com hackers, não use o MD5, mas se quiser saber se alguns arquivos copiados de um CD foram corrompidos ou se o seu compilador gera arquivos idênticos toda vez, o MD5 é mais que adequado.
Adam Batkin
3

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

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

JustJeff
fonte
2
Se você quiser saber se são dois arquivos iguais, acho que o uso do sha1sum (ou md5sum) pode ser mais eficiente do que apenas o diff (pois essa foi a pergunta original), porque mesmo se os dois ( grandes) arquivos diferem no começo), você os lerá inteiramente antes de saber que eles diferem.
Pierre
@Pierre MAS, o hash e a assinatura de criptografia funcionam em dispositivos remotos.
VasyaNovikov
1

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

# 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

Voltei a executar o exercício com um arquivo de 4,3 GB e tive que excluir e recriar o arquivo com dd, pois o cache da RAM estava afetando bastante 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.

proibidor
fonte
Eu gosto que você realmente tenha feito um benchmark, mas 100 Mb não é representativo do caso do OP. 1.000Mb seria muito melhor.
jpaugh
11
concordou e é por isso que executei os testes de 4,3 gig alguns meses depois. Na verdade, foi necessário um esforço para ignorar o cache do SO.
proibidor
Eu imagino que sim. Peço desculpas por não ter lido o meio da sua resposta. (Eu ainda achava que era bom o suficiente para votar, mesmo vendo apenas a primeira referência.) FWIW, há alguma mágica do kernel para desativar o cache de arquivos. Eu mesmo teria que fazer a referência para ver quais realmente funcionam ou são necessárias.
jpaugh