Wie mache ich unter Linux einen Binärdiff für zwei Dateien mit identischer Größe?

37

Ich habe zwei Dateien mit identischer Größe und muss ein binäres Diff ausführen, um zu überprüfen, ob sie identisch sind.

Ich laufe gerade diff file1.img file2.img Die Verarbeitung meiner 4-GB-Dateien dauert jedoch einige Zeit. Ist dies der effizienteste Weg, dies zu tun?

Jon Cage
quelle

Antworten:

44

cmp dient zum Auffinden von Unterschieden in Binärdateien. Sie könnten auch versuchen, Prüfsumme ( sum ) und vergleiche die Hashes.

mpez0
quelle
20

Eine der häufigsten Methoden, um festzustellen, ob zwei Dateien identisch sind (vorausgesetzt, ihre Größe stimmt überein), ist die Verwendung eines Programms zum Erstellen eines " hash "(im Wesentlichen ein Fingerabdruck) einer Datei. Die häufigsten sind md5sum und sha1sum.

Zum Beispiel:

$ md5sum file1 file2
e0e7485b678a538c2815132de7f9e878  file1
4a14aace18d472709ccae3910af55955  file2

Wenn Sie viele Dateien überprüfen müssen, beispielsweise wenn Sie ein Verzeichnis voller Dateien von einem System auf ein anderes übertragen, können Sie die Ausgabe vom ursprünglichen System in eine Datei umleiten md5sum / sha1sum Mit dieser Datei können Sie automatisch feststellen, welche Dateien unterschiedlich sind:

$ md5sum file1 file2 > MD5SUMS
... copy file1, file2, MD5SUMS across
$ md5sum --check MD5SUMS
file1: OK
file2: OK
Adam Batkin
quelle
2
MD5 ist dafür nicht immer zuverlässig: digg.com/security/…
Jon Cage
27
Eigentlich MD5 ist zuverlässig für grundlegende Integritätsprüfungen. Es wird einfach nicht als kryptografisch stark angesehen, wie wir einst dachten. Wenn Sie sich Sorgen um Hacker machen, verwenden Sie MD5 nicht. Wenn Sie jedoch wissen möchten, ob einige von einer CD kopierte Dateien beschädigt wurden oder ob Ihr Compiler jedes Mal identische Dateien ausspuckt, ist MD5 mehr als ausreichend.
Adam Batkin
3

Wenn ich nur wissen will, ob sie gleich sind, bevorzuge ich die Verwendung sha1sum wenn es verfügbar ist, oder md5 als ein Fallback.

Wenn ich wissen will, wie unterschiedlich sie sind oder wo sie sich unterscheiden, ist es eine Sache, sie beide durchzudrehen od ('octal dump', normalerweise mit hexadezimaler Option), um temporäre Dateien zu erstellen und diese dann zu unterscheiden.

JustJeff
quelle
2
Wenn Sie wissen möchten, ob es sich um zwei Dateien handelt, die identisch sind, kann die Verwendung von sha1sum (oder md5sum) meiner Meinung nach nicht effizienter sein als nur diff (da dies die ursprüngliche Frage war), denn selbst wenn die beiden Dateien identisch sind ( große) Dateien unterscheiden sich von Anfang an; Sie werden beide vollständig lesen, bevor Sie feststellen, dass sie sich unterscheiden.
Pierre
@ Pierre ABER, Hashing und Kryptosignierung funktionieren auf allen Remote-Geräten.
VasyaNovikov
1

Ich habe gerade einige Benchmarks für eine Datei mit mehr als 100 MB ausgeführt. diff war am schnellsten, während cmp an zweiter Stelle und md5sum an letzter Stelle landete.

# 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

Ich habe die Übung mit einer 4,3-GB-Datei wiederholt und musste die Datei mit dd löschen und neu erstellen, da das RAM-Caching die Ergebnisse erheblich beeinflusste.

$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

Aufgrund dieser Ergebnisse würde ich empfehlen, die Dateien auf einen RAMFS-Mount zu verschieben und bei diff zu bleiben.

forbidder
quelle
Ich mag es, dass Sie tatsächlich einen Benchmark durchgeführt haben, aber 100 MB sind nicht repräsentativ für den Fall des OP. 1.000 MB wären viel besser.
jpaugh
1
stimmte zu, weshalb ich einige Monate später die 4,3-Gig-Tests durchführte. Es hat tatsächlich Mühe gekostet, das Caching des Betriebssystems zu umgehen.
forbidder
Das stelle ich mir vor. Ich entschuldige mich dafür, dass Sie die Mitte Ihrer Antwort nicht gelesen haben. (Ich dachte immer noch, dass es gut genug ist, um zu stimmen, auch wenn ich nur den ersten Benchmark gesehen habe.) FWIW, es gibt einige Kernelmagie zum Deaktivieren der Zwischenspeicherung von Dateien. Ich müsste den Benchmark selbst durchführen, um zu sehen, welche tatsächlich funktionieren oder notwendig sind.
jpaugh