在 Linux 下,如何对两个大小相同的文件进行二进制差异分析?

在 Linux 下,如何对两个大小相同的文件进行二进制差异分析?

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

我目前正在运行,diff file1.img file2.img但处理 4 GB 的文件需要很长时间。这是最有效的方法吗?

答案1

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

答案2

确定两个文件是否相同(假设它们的大小匹配)的最常见方法之一是使用程序创建“哈希“(本质上是文件的指纹)。最常见的是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

答案3

找到了解决方案 -cmp 工具它与大多数 Linux 版本兼容。

答案4

我刚刚对一个 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 的文件重新运行了练习,并且不得不使用 dd 删除并重新创建该文件,因为 RAM 缓存极大地影响了结果。

$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。

相关内容