Answers:
如果将一个文件与多个文件进行比较,或者将多个文件进行相互比较,则创建散列来比较文件是有意义的。
仅一次比较两个文件没有任何意义:计算散列的工作量至少与遍历文件并直接比较它们一样高。
一个有效的文件比较工具是cmp
:
cmp --bytes $((100 * 1024 * 1024)) file1 file2 && echo "File fragments are identical"
您还可以将其与dd
比较两个文件的任意部分(不一定从开头开始),例如:
cmp \
<(dd if=file1 bs=100M count=1 skip=1 2>/dev/null) \
<(dd if=file2 bs=100M count=1 skip=1 2>/dev/null) \
&& echo "File fragments are identical"
cmp
如果您bash
正在运行,则肯定已经安装了99.99%,并且可以完成此工作。确实,cmp -n 131072 one.zip two.zip
也可以完成这项工作。键入字符最少,执行速度最快。计算哈希是没有意义的。它要求读取整个100MB的文件,再加上整个文件的100MB的部分,这毫无意义。如果它们是zip文件并且不同,则前几百个字节之间会有差异。Readahead默认情况下提供128k,因此您也可以比较128k(与比较1个字节相同的成本)。
--bytes
选项仅使任务复杂化。cmp
不用此选项即可运行,它将显示文件之间不同的第一个字节。如果所有字节都相同,则它将显示EOF
在较短的文件中。这将为您提供比示例更多的信息-正确的字节数。
cmp
(而且我想几乎每个人都可以),则可以使用--ignore-initial
和--bytes
参数,而不必将的调用复杂化dd
。
抱歉,我无法完全尝试,但是这种方法可以工作
dd if=yourfile.zip of=first100mb1.dat bs=100M count=1
dd if=yourotherfile.zip of=first100mb2.dat bs=100M count=1
这将使您获得两个文件的前100 MB。
现在获取哈希:
sha256sum first100mb1.dat && sha256sum first100mb2.dat
您也可以直接运行它:
dd if=yourfile.zip bs=100M count=1 | sha256sum
dd if=yourotherfile.zip bs=100M count=1 | sha256sum
cmp
)相比,效率要低得多。
cmp
)无疑是赢家。但是,这种解决问题的方法(使用哈希)也有权存在,只要它能够实际解决问题即可(:
您可以使用二进制/十六进制diff程序直接比较文件vbindiff
。它可以在Linux和Windows上快速比较高达4GB的文件。
看起来像这样,只是差异以红色突出显示(1B与1C):
one
0000 0000: 30 5C 72 A7 1B 6D FB FC 08 00 00 00 00 00 00 00 0\r..m.. ........
0000 0010: 00 00 00 00 ....
0000 0020:
0000 0030:
0000 0040:
0000 0050:
0000 0060:
0000 0070:
0000 0080:
0000 0090:
0000 00A0:
two
0000 0000: 30 5C 72 A7 1C 6D FB FC 08 00 00 00 00 00 00 00 0\r..m.. ........
0000 0010: 00 00 00 00 ....
0000 0020:
0000 0030:
0000 0040:
0000 0050:
0000 0060:
0000 0070:
0000 0080:
0000 0090:
0000 00A0:
┌──────────────────────────────────────────────────────────────────────────────┐
│Arrow keys move F find RET next difference ESC quit T move top │
│C ASCII/EBCDIC E edit file G goto position Q quit B move bottom │
└──────────────────────────────────────────────────────────────────────────────┘
vbindiff
(和Konrad的cmp
)逐字节比较二进制数据。实际上,值更容易发生冲突
cmp会告诉您两个文件何时相同(不超过较小文件的长度):
$ dd if=/dev/random bs=8192 count=8192 > a
8192+0 records in
8192+0 records out
67108864 bytes transferred in 0.514571 secs (130417197 bytes/sec)
$ cp a b
$ dd if=/dev/random bs=8192 count=8192 >> b
8192+0 records in
8192+0 records out
67108864 bytes transferred in 0.512228 secs (131013601 bytes/sec)
$ cmp a b
cmp: EOF on a
cmp告诉您比较在文件a上遇到EOF,然后才检测到两个文件之间的任何差异。