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.
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.
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
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]
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
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
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: -)
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
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
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
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