Jak porównać pliki binarne, aby sprawdzić, czy są takie same?

Jaki jest najprostszy sposób (za pomocą narzędzia graficznego lub Wiersza poleceń na Ubuntu Linux), aby wiedzieć, czy dwa pliki binarne są takie same, czy nie (z wyjątkiem znaczników czasu)? Nie muszę wydobywać różnicy. Muszę tylko wiedzieć, czy są takie same, czy nie.

10 answers

Standardowy unix diff pokaże, czy pliki są takie same, czy nie:

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

Jeśli nie ma wyjścia z polecenia, oznacza to, że pliki nie mają różnic.

 116
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-12 13:09:34

Użyj polecenia cmp. To albo zakończy się czysto, jeśli są równe binarnie, albo wyświetli się, gdzie występuje pierwsza różnica i zakończy.

 76
Author: bobjandal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-05 20:44:31

I found Visual Binary Diff was what I was looking for, available on:

  • Ubuntu: apt-get install vbindiff
  • Mac OS X: port install vbindiff via MacPorts .
  • Mac OS X: brew install vbindiff via Homebrew
 61
Author: shao.lo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-04 20:09:55

Użyj sha1 do wygenerowania sumy kontrolnej:

sha1 [FILENAME1]
sha1 [FILENAME2]
 14
Author: Scott Presnell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-25 01:21:06

Skończyło się na użyciu zrzutu heksowego do konwersji plików binarnych do reprezentacji szesnastkowej, a następnie otworzyłem je w meld / kompare / dowolnym innym narzędziu diff. W przeciwieństwie do ciebie, chodziło mi o różnice w plikach.

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

meld tmp/hex1.txt tmp/hex2.txt
 9
Author: simotek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-10 03:46:19

Użyj polecenia cmp. Więcej informacji można znaleźć w plikach binarnych i wymuszaniu porównań tekstowych .

cmp -b file1 file2
 6
Author: user2008151314,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-08 23:50:30

md5 <filename1>

md5 <filename2>

Zobacz czy są takie same: -)

 4
Author: Rikki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-27 15:19:49

Diff z następującymi opcjami zrobi binarne porównanie, aby sprawdzić, czy pliki są różne w ogóle i wyjdzie, jeśli pliki są takie same, jak również:

diff -qs {file1} {file2}

Jeśli porównujesz dwa pliki o tej samej nazwie w różnych katalogach, możesz użyć tego formularza:

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

OS X El Capitan

 4
Author: DKroot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-11 18:04:37

Aby znaleźć wady pamięci flash, musiałem napisać ten skrypt, który pokazuje wszystkie bloki 1K, które zawierają różnice (nie tylko pierwszy, jak to robi cmp -b)

#!/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

Wyjście:

   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 $

Zastrzeżenie: zhakowałem skrypt w 5 min. Nie obsługuje argumentów wiersza poleceń ani spacji w nazwach plików

 3
Author: Daniel Alder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-09 14:05:54

Spróbuj diff-s

Krótka odpowiedź: Uruchom diff za pomocą przełącznika -s.

Długa odpowiedź: Czytaj dalej poniżej.


Oto przykład. Zacznijmy od utworzenia dwóch plików z losową zawartością binarną:
$ 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

Teraz zróbmy kopię pierwszego pliku:

$ cp test1.bin copyoftest1.bin

Teraz test1.bin i test2.kosz powinien być inny:

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

... i test1.bin i copyoftest1.kosz powinien być identyczny:

$ diff test1.bin copyoftest1.bin

Ale czekaj! Dlaczego nie ma wyjście?!?

Odpowiedź brzmi: to z założenia. Nie ma wyjścia na identycznych plikach.

Ale są różne kody błędów:

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

$ echo $?
1


$ diff test1.bin copyoftest1.bin

$ echo $?
0

Teraz na szczęście nie musisz sprawdzać kodów błędów za każdym razem, ponieważ możesz po prostu użyć -s (lub --report-identical-files) Przełącz aby diff był bardziej wyrazisty:

$ diff -s test1.bin copyoftest1.bin
Files test1.bin and copyoftest1.bin are identical
 3
Author: StackzOfZtuff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-05 12:02:56