it-swarm.com.de

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

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 bin derzeit diff file1.img file2.img runnnig, aber es dauert eine ganze Weile, meine 4 GB-Dateien zu verarbeiten. Ist dies der effizienteste Weg, dies zu tun?

37
Jon Cage

Es wurde eine Lösung gefunden - das CMP-Tool , das mit den meisten Linux-Versionen geliefert wird.

16
Jon Cage

cmp soll Unterschiede in Binärdateien finden. Sie können auch versuchen, eine Prüfsumme (sum) zu erstellen und die Hashes zu vergleichen.

44
mpez0

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 " - Hashs " (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 zu überprüfende Dateien haben, 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. Dann kann md5sum/sha1sum diese Datei automatisch verwenden um Ihnen zu sagen, welche Dateien unterschiedlich sind:

$ md5sum file1 file2 > MD5SUMS
... copy file1, file2, MD5SUMS across
$ md5sum --check MD5SUMS
file1: OK
file2: OK
20
Adam Batkin

Wenn ich nur wissen will, ob sie gleich sind, bevorzuge ich sha1sum , falls verfügbar, oder md5 als Fallback.

Wenn ich wissen will, wie unterschiedlich sie sind oder wo sie sich unterscheiden, funktioniert es, sie beide durch od ('octal dump ', die normalerweise eine hex-Option hat), um temporäre Dateien zu erstellen und diese dann zu unterscheiden.

3
JustJeff

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 Zwischenspeichern von RAM 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.

1
forbidder