Antworten:
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
Eine Lösung gefunden - das cmp tool das kommt mit den meisten Linux-Aromen.
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.
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.