Como comparar arquivos binários para verificar se são iguais?

186

Qual é a maneira mais fácil (usando uma ferramenta gráfica ou linha de comando no Ubuntu Linux) para saber se dois arquivos binários são iguais ou não (exceto os carimbos de hora)? Na verdade, não preciso extrair a diferença. Eu só preciso saber se eles são iguais ou não.

sawa
fonte
5
Uma pergunta pedindo para show de como eles diferem: superuser.com/questions/125376/...
Ciro Santilli郝海东冠状病六四事件法轮功
2
A página de manual cmpdiz especificamente que ele faz uma comparação de byte a byte, de modo que é o meu padrão para 2 arquivos binários. diffé linha por linha e fornecerá a mesma resposta Sim / Não, mas é claro que não será o mesmo despejo para o fluxo de saída padrão. Se as linhas são longas, porque talvez não sejam arquivos de texto, eu preferiria cmp. difftem a vantagem de poder especificar uma comparação de diretórios e a -rrecursão for, comparando vários arquivos em um comando.
H2ONaCl 24/12

Respostas:

180

O unix padrão diffmostrará se os arquivos são iguais ou não:

[me@host ~]$ diff 1.bin 2.bin
Binary files 1.bin and 2.bin differ

Se não houver saída do comando, significa que os arquivos não têm diferenças.

Joe
fonte
5
diff parece ter problemas com arquivos muito grandes . Eu recebi um diff: memory exhaustedao comparar dois arquivos 13G.
Yongwei Wu
1
Saída interessante. diffestá dizendo que eles são "binários". Como todos os arquivos podem ser considerados binários, é uma afirmação estranha.
H2ONaCl 24/12
7
Você pode relatar arquivos idênticos com opção: diff -s 1.bin 2.binou diff --report-identical-files 1.bin 2.binIsto mostraFiles 1.bin and 2.bin are identical
Tom Kuschel
1
Não, ele dirá que eles são "diferentes", portanto não são os mesmos #
315 Josef Klimuk
1
Eu tenho dois executáveis, eu sei que eles são diferentes porque eu os compilei e os executei, mas todas as opções de diff e cmp fornecidas aqui os julgam idênticas. Por quê? !!!
28419 mirkastath
107

Use o cmpcomando Isso sairá corretamente se eles forem binários iguais ou será impresso onde a primeira diferença ocorre e sairá.

bobjandal
fonte
9
Para o caso de uso, o OP descreve que IMHO cmpé mais eficiente que diff. Então, eu prefiro isso.
Halloleo
5
Eu tenho um shell script que é executado:cmp $1 $2 && echo "identical" || echo "different"
steveha
2
o cmp para quando encontra a primeira diferença e a exibe ou passa pelo final dos arquivos?
sop
cmptem modo "silencioso": -s, --quiet, --silent- suppress all normal output. Ainda não testei, mas acho que isso irá parar na primeira diferença, se houver.
Victor Yarema
90

Achei que Visual Binary Diff era o que eu estava procurando, disponível em:

  • Ubuntu:

    sudo apt install vbindiff
    
  • Arch Linux:

    sudo pacman -S vbindiff
    
  • Mac OS X via MacPorts :

    port install vbindiff
    
  • Mac OS X via Homebrew:

    brew install vbindiff
    
shao.lo
fonte
1
Bom ... pensei / só queria saber se os arquivos eram diferentes; mas ser capaz de ver as diferenças exatas facilmente era muito mais útil. Tendia a falhar quando cheguei ao final do arquivo, mas não importa, ainda funcionava.
28416 Jeremy
2
Já foi dito algumas vezes, mas este é um ótimo pequeno programa! (fyi também em homebrew)
johncip
2
Essa deve ser a resposta aceita, pois é um método muito superior ao resultado branda e inútil do comando diff canônico.
Gearoid Murphy #
1
Esta é a melhor ferramenta para diff binário.
Carla Camargo
17

Use sha1 para gerar soma de verificação:

sha1 [FILENAME1]
sha1 [FILENAME2]
Scott Presnell
fonte
3
Se você tivesse apenas uma soma de verificação para um dos arquivos, isso seria útil, mas se você tiver os dois arquivos no disco, isso será desnecessário. diffe cmpambos lhe dirão se eles diferem sem nenhum esforço extra.
19617 johncip
1
Não é em sha1sumvez de sha1?
24417 kol
2
sha1 no NetBSD, sha1sum no Linux
Scott Presnell
2
Existem dois arquivos que retornarão o mesmo resultado, apesar de serem diferentes: shattered.io
mik:
2
O SHA1 já tem uma colisão pública ( shattered.io ) e provavelmente algumas não públicas. Uma colisão pode ser usada para gerar inúmeros arquivos em colisão. Use SHA2 para hash, por favor.
Michal Ambroz
12

Acabei usando o hexdump para converter os arquivos binários em uma representação hexadecimal e os abri em meld / kompare / qualquer outra ferramenta diff. Ao contrário de você, eu estava atrás das diferenças nos arquivos.

hexdump tmp/Circle_24.png > tmp/hex1.txt
hexdump /tmp/Circle_24.png > tmp/hex2.txt

meld tmp/hex1.txt tmp/hex2.txt
simotek
fonte
1
Use hexdump -v -e '/1 "%02x\n"'se quiser diferenciar e ver exatamente quais bytes foram inseridos ou removidos.
William Entriken
O Meld também trabalha com arquivos binários quando eles não são convertidos em hexadecimal primeiro. Ele mostra valores hexadecimais para coisas que não estão no conjunto de caracteres, caso contrário, caracteres normais, que são úteis com arquivos binários que também contêm algum texto ascii. Muitos sim, pelo menos começam com uma corda mágica.
Felix Dombek
7

Você pode usar a função de hash MD5 para verificar se dois arquivos são iguais, com isso você não consegue ver as diferenças em um nível baixo, mas é uma maneira rápida de comparar dois arquivos.

md5 <filename1>
md5 <filename2>

Se os dois hashes MD5 (a saída do comando) forem os mesmos, os dois arquivos não serão diferentes.

Rikki
fonte
7
Você pode explicar seus votos negativos, por favor? O SHA1 tem 4 votos positivos e, se o OP achar que há uma chance de os dois arquivos serem iguais ou similares, as chances de uma colisão são pequenas e não valem a pena votar no MD5, mas votam no SHA1, exceto porque você ouviu que deveria senhas com SHA1 em vez de MD5 (esse é um problema diferente).
Rikki 16/01
2
não tem certeza sobre a razão, mas a CMP pura será mais eficiente do que computar qualquer função hash de arquivos e compará-los (pelo menos para apenas 2 arquivos)
Paweł Szczur
1
se os dois arquivos forem grandes e no mesmo disco (não ssd), a variante md5 ou sha * poderá ser mais rápida porque os discos podem ler os dois arquivos sequencialmente, o que economiza muitos movimentos da cabeça
Daniel Alder
7
Fiz uma votação baixa porque você postou uma variante menor de uma solução anterior (ruim), quando deveria ter sido um comentário.
johncip
6

Use o comando cmp. Consulte Arquivos binários e forçando comparações de texto para obter mais informações.

cmp -b file1 file2
user2008151314
fonte
1
-bnão compara arquivos no "modo binário". Na verdade, "Com o GNU cmp, você também pode usar a opção -bou --print-bytespara mostrar a representação ASCII desses bytes.". Foi exatamente isso que encontrei usando o URL do manual que você forneceu.
22416 Victor Yarema
Victor Yarema, não sei o que você quer dizer com "modo binário". cmpé inerentemente uma comparação binária na minha opinião. A -bopção apenas imprime o primeiro byte diferente.
H2ONaCl
4

Para encontrar defeitos na memória flash, tive que escrever este script que mostra todos os blocos de 1K que contêm diferenças (não apenas o primeiro como o cmp -bfaz)

#!/bin/sh

f1=testinput.dat
f2=testoutput.dat

size=$(stat -c%s $f1)
i=0
while [ $i -lt $size ]; do
  if ! r="`cmp -n 1024 -i $i -b $f1 $f2`"; then
    printf "%8x: %s\n" $i "$r"
  fi
  i=$(expr $i + 1024)
done

Resultado:

   2d400: testinput.dat testoutput.dat differ: byte 3, line 1 is 200 M-^@ 240 M- 
   2dc00: testinput.dat testoutput.dat differ: byte 8, line 1 is 327 M-W 127 W
   4d000: testinput.dat testoutput.dat differ: byte 37, line 1 is 270 M-8 260 M-0
   4d400: testinput.dat testoutput.dat differ: byte 19, line 1 is  46 &  44 $

Disclaimer: Eu hackeei o script em 5 min. Ele não suporta argumentos de linha de comando nem espaços em nomes de arquivos

Daniel Alder
fonte
Eu recebo "r: não encontrado" (usando GNU linux)
unseen_rider
@unseen_rider qual shell, qual linha? Por favor, chame o script usando sh -xpara depuração
Daniel Alder
Isso é feito chamando o script do terminal. A linha é 9.
unseen_rider
@unseen_rider Não posso ajudá-lo dessa maneira. O script está ok. Envie sua saída de depuração para pastebin.com . Você pode ver aqui o que quero dizer: pastebin.com/8trgyF4A . Além disso, por favor, diga-me a saída dereadlink -f $(which sh)
Daniel Alder
O último comando dá /bin/dash. Atualmente criando colar em pastebin.
unseen_rider
4

A diferença com as seguintes opções faria uma comparação binária para verificar se os arquivos são diferentes e produziria se os arquivos fossem os mesmos:

diff -qs {file1} {file2}

Se você estiver comparando dois arquivos com o mesmo nome em diretórios diferentes, poderá usar este formulário:

diff -qs {file1} --to-file={dir2}

OS X El Capitan

DKroot
fonte
3

Tente diff -s

Resposta curta: corra diffcom o -sinterruptor.

Resposta longa: leia abaixo.


Aqui está um exemplo. Vamos começar criando dois arquivos com conteúdo binário aleatório:

$ dd if=/dev/random bs=1k count=1 of=test1.bin
1+0 records in
1+0 records out
1024 bytes (1,0 kB, 1,0 KiB) copied, 0,0100332 s, 102 kB/s

                                                                                  
$ dd if=/dev/random bs=1k count=1 of=test2.bin
1+0 records in
1+0 records out
1024 bytes (1,0 kB, 1,0 KiB) copied, 0,0102889 s, 99,5 kB/s

Agora vamos fazer uma cópia do primeiro arquivo:

$ cp test1.bin copyoftest1.bin

Agora test1.bin e test2.bin devem ser diferentes:

$ diff test1.bin test2.bin
Binary files test1.bin and test2.bin differ

... e test1.bin e copyoftest1.bin devem ser idênticos:

$ diff test1.bin copyoftest1.bin

Mas espere! Por que não há saída?!?

A resposta é: isso ocorre por design. Não há saída em arquivos idênticos.

Mas existem códigos de erro diferentes:

$ diff test1.bin test2.bin
Binary files test1.bin and test2.bin differ

$ echo $?
1


$ diff test1.bin copyoftest1.bin

$ echo $?
0

Agora, felizmente, você não precisa verificar os códigos de erro todas as vezes, porque pode usar a opção -s(ou --report-identical-files) para tornar o diff mais detalhado:

$ diff -s test1.bin copyoftest1.bin
Files test1.bin and copyoftest1.bin are identical
StackzOfZtuff
fonte
2

Radiff2 é uma ferramenta projetada para comparar arquivos binários, semelhante à comparação regular de arquivos de texto com diff.

Experimente o radiff2que faz parte do radare2desmontador. Por exemplo, com este comando:

radiff2 -x file1.bin file2.bin

Você obtém duas colunas bastante formatadas, onde as diferenças são destacadas.

engraçado
fonte
1

Meus favoritos usando o xxd hex-dumper do pacote vim:

1) usando vimdiff (parte do vim)

#!/bin/bash
FILE1="$1"
FILE2="$2"
vimdiff <( xxd "$FILE1" ) <( xxd "$FILE2" )

2) usando diff

#!/bin/bash
FILE1=$1
FILE2=$2
diff -W 140 -y <( xxd $FILE1 ) <( xxd $FILE2 ) | colordiff | less -R -p '  \|  '
Michal Ambroz
fonte
0
md5sum binary1 binary2

Se o md5sum for o mesmo, os binários serão os mesmos

Por exemplo

md5sum new*
89c60189c3fa7ab5c96ae121ec43bd4a  new.txt
89c60189c3fa7ab5c96ae121ec43bd4a  new1.txt
root@TinyDistro:~# cat new*
aa55 aa55 0000 8010 7738
aa55 aa55 0000 8010 7738


root@TinyDistro:~# cat new*
aa55 aa55 000 8010 7738
aa55 aa55 0000 8010 7738
root@TinyDistro:~# md5sum new*
4a7f86919d4ac00c6206e11fca462c6f  new.txt
89c60189c3fa7ab5c96ae121ec43bd4a  new1.txt
acinzentado
fonte
1
Não é bem assim. Somente a possibilidade é alta.
sawa
Qual é a probabilidade de falhar?
ashish
Magro, mas pior do que usar uma variante de diff, sobre a qual não há razão para preferir.
sawa
Você precisaria alterar o hash MD5 para SHA2 para que este conselho fosse prático. Atualmente, o laptop de qualquer pessoa pode gerar colisão no MD5 e com base nesse único prefixo de colisão (2 arquivos do mesmo tamanho, mesmo prefixo e mesmo MD5) para gerar um número infinito de arquivos em colisão (com o mesmo prefixo, bloco de colisão diferente, mesmo sufixo)
Michal Ambroz
-1

Existe uma maneira relativamente simples de verificar se dois arquivos binários são iguais.

Se você usa entrada / saída de arquivo em uma linguagem de programação; você pode armazenar cada bit dos dois arquivos binários em suas próprias matrizes.

Nesse ponto, a verificação é tão simples quanto:

if(file1 != file2){
    //do this
}else{
    /do that
}
Ahab Devoid
fonte