在Linux下如何在两个相同大小的文件上执行二进制差异?


37

我有两个大小相同的文件,我需要进行二进制比较以检查它们是否相同。

我当前正在运行,diff file1.img file2.img但是要花一些时间来处理我的4 GB文件。这是最有效的方法吗?

Answers:


45

cmp用于查找二进制文件中的差异。您也可以尝试校验和(sum)并比较哈希值。


21

确定两个文件是否相同(假设它们的大小匹配)的最常见方法之一是使用程序来创建文件的“ 哈希 ”(本质上是指纹)。最常见的是md5sumsha1sum

例如:

$ md5sum file1 file2
e0e7485b678a538c2815132de7f9e878  file1
4a14aace18d472709ccae3910af55955  file2

如果您有许多文件需要检查,例如,如果要将一个充满文件的目录从一个系统转移到另一个系统,则可以将输出从原始系统重定向到一个文件,然后md5sum/ sha1sum可以自动使用该文件来告知您哪些文件不同:

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

2
MD5并不总是可靠的:digg.com/security/…–
乔恩·凯奇

28
实际上,MD5 对于基本完整性检查可靠的。它只是不像我们曾经认为的那样在密码学上很强大。如果您担心黑客,请不要使用MD5,但是如果您只想知道从CD复制的某些文件是否损坏,或者您的编译器每次吐出相同的文件,则MD5绰绰有余。
亚当·巴特金


3

如果我只是想知道它们是否相同,我宁愿使用sha1sum(如果可用),也可以使用md5作为后备。

如果我想知道它们之间的不同之处或不同之处,则可以通过od(通常为hex选项的“八进制转储”)将它们同时启动以创建临时文件,然后对它们进行比较。


2
如果您想知道两个文件是否相同,我认为使用sha1sum(或md5sum)不会比diff(因为这是原始问题)更有效,因为即使两个文件(较大的文件一开始就有所不同),您将在知道它们完全不同之前先完整阅读它们。
Pierre

@Pierre BUT,哈希和加密签名可在远程设备上运行。
VasyaNovikov 2015年

1

我只是对100 MB以上的文件运行了一些基准测试。diff是最快的,而cmp位居第二,而使用md5sum位居最后。

# 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

我用4.3 GB的文件重新运行了该练习,由于RAM缓存极大地影响了结果,因此不得不使用dd删除并重新创建该文件。

$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

基于这些结果,我建议将文件移至RAMFS挂载,并坚持使用diff。


我喜欢您实际上做了一个基准测试,但是100 Mb不能代表OP的情况。1,000Mb会好得多。
jpaugh

1
同意,这就是为什么几个月后我运行4.3 gig测试的原因。实际上,它花了很多精力来绕过OS缓存。
禁止

我想是的。很抱歉没有阅读您的答案的中间部分。(即使只看到第一个基准测试,我仍然认为它足以胜任。)FWIW,禁用文件缓存有一些内核魔术。我必须自己进行基准测试,以查看哪些实际有效或必要。
jpaugh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.