什么是最简单的方法(在Ubuntu Linux上使用图形工具或命令行)知道两个二进制文件是否相同(时间戳除外)?我不需要真正提取差异。我只需要知道他们是否相同。如何比较二进制文件以检查它们是否相同?
回答
标准的UNIX diff
将显示,如果这些文件是相同的或不:
[[email protected] ~]$ diff 1.bin 2.bin
Binary files 1.bin and 2.bin differ
如果没有从该命令的输出,这意味着该文件没有区别。
我发现Visual Binary Diff就是我一直在寻找,可在:
- Ubuntu的:
apt-get install vbindiff
- 的Mac OS X。
- 的Mac OS X:
brew install vbindiff
通过自制
使用cmp命令。有关更多信息,请参阅Binary Files and Forcing Text Comparisons。
cmp -b file1 file2
'-b'不会比较文件“二进制模式”。它实际上“使用GNU'cmp',你也可以使用'-b'或'--print-bytes'选项来显示这些字节的ASCII表示。”这正是我用URL提供的手册找到的。 –
Victor Yarema,我不知道你的意思是“二元模式”。在我看来,'cmp'本质上是一个二元比较。 '-b'选项仅打印不同的第一个字节。 – H2ONaCl
为了找到闪存的缺陷,我不得不写这个脚本,其示出包含所有1K块的差异(未只有第一个作为cmp -b
那样)
#!/bin/sh
f1=testinput.dat
f2=testoutput.dat
size=$(stat -c%s $f1)
i=0
while [ $i -lt $size ]; do
if ! r="`cmp -n 1024 -i $i -b $f1 $f2`"; then
printf "%8x: %s\n" $i "$r"
fi
i=$(expr $i + 1024)
done
输出:
2d400: testinput.dat testoutput.dat differ: byte 3, line 1 is 200 M-^@ 240 M-
2dc00: testinput.dat testoutput.dat differ: byte 8, line 1 is 327 M-W 127 W
4d000: testinput.dat testoutput.dat differ: byte 37, line 1 is 270 M-8 260 M-0
4d400: testinput.dat testoutput.dat differ: byte 19, line 1 is 46 & 44 $
声明:我在5分钟内破解了该脚本。它不支持命令行参数,也不支持空格的文件名
真棒剧本老兄! – pmargreff
我得到“r:找不到”(使用GNU linux) –
@unseen_rider哪个shell,哪一行?请使用'sh -x'调用脚本进行调试 –
md5 <filename1>
md5 <filename2>
看看它们是相同的:-)
你能解释你的倒票吗? SHA1有4个upvotes,如果OP认为有两个文件可能是相同或相似的机会,碰撞的机会是轻微的,不值得MD5投票,但投票SHA1以外,因为你听说你应该哈希你密码与SHA1而不是MD5(这是一个不同的问题)。 – Rikki
不确定的原因,但纯cmp将比计算文件的任何散列函数和比较它们(至少只有2个文件) –
,如果两个文件很大,并在同一磁盘(不ssd),效率md5或sha *变种可能会更快,因为磁盘可以顺序读取这两个文件,从而节省大量头部移动 –
我结束了使用hexdump都来将二进制文件转换为十六进制表示,然后在meld/kompare /任何其他diff工具中打开它们。与你不同,我是在文件的差异之后。
hexdump tmp/Circle_24.png > tmp/hex1.txt
hexdump /tmp/Circle_24.png > tmp/hex2.txt
meld tmp/hex1.txt tmp/hex2.txt
如果您想要比较并确切地看到哪些字节被插入或删除,请使用'hexdump -v -e'/ 1“%02x \ n”'''。 –
DIFF与下列选项会做一个二进制比较来检查只是如果文件是不同的,在一切,它会输出,如果文件是相同的还有:
diff -qs {file1} {file2}
如果您是比较在不同的目录中的两个同名文件,你可以改用此表单:
diff -qs {file1} --to-file={dir2}
OS X埃尔卡皮坦
尝试差异-s
简短回答:使用-s
开关运行diff
。
长答案:请在下面阅读。
下面是一个例子。让我们通过创建两个文件随机二进制内容开始:
$ dd if=/dev/random bs=1k count=1 of=test1.bin
1+0 records in
1+0 records out
1024 bytes (1,0 kB, 1,0 KiB) copied, 0,0100332 s, 102 kB/s
$ dd if=/dev/random bs=1k count=1 of=test2.bin
1+0 records in
1+0 records out
1024 bytes (1,0 kB, 1,0 KiB) copied, 0,0102889 s, 99,5 kB/s
现在让我们把第一个文件的副本:
$ cp test1.bin copyoftest1.bin
现在test1.bin和test2.bin应该是不同的:
$ diff test1.bin test2.bin
Binary files test1.bin and test2.bin differ
...和test1.bin和copyoftest1.bin应该是相同的:
$ diff test1.bin copyoftest1.bin
但是等一下!为什么没有输出?!?
答案是:这是设计。在相同的文件上没有输出。
但也有不同的错误代码:
$ diff test1.bin test2.bin
Binary files test1.bin and test2.bin differ
$ echo $?
1
$ diff test1.bin copyoftest1.bin
$ echo $?
0
现在幸运的您不必检查每一次错误代码,因为你可以只使用-s
(or --report-identical-files
) switch,使差异更为详细:
$ diff -s test1.bin copyoftest1.bin
Files test1.bin and copyoftest1.bin are identical
- 1. 逐行比较文件以查看它们是否相同,如果是这样的话输出它们
- 2. 比较文件和列表,看看它们是否相同
- 3. 比较两个文件,看它们在PHP中是否相同
- 4. 如何检查文件是否是二进制文件?
- 5. 如何比较2个xml文件知道它是否相同
- 6. 比较两个ObservableCollection(s)以查看它们是否不同
- 7. 什么是二进制比较,它与文本比较有什么不同
- 8. 比较两个输入的数字以查看它们是否相同
- 9. 如何检查比较回文是否?
- 10. 如何比较输入[0]和输入[1]以查看它们是否相似?
- 11. ç打开文件来检查它是否是二进制的,如果是这样打印是二进制
- 12. 如何检查字符串是否在二进制文件
- 13. 如何检查HDFS文件是否包含二进制数据?
- 14. 比较两棵树,看看它们是否相同
- 15. 比较峰的算法:它们是否同相?
- 16. 比较2棵树看它们是否包含相同的值
- 17. 如何在Dart中比较两个对象以查看它们是否是相同的实例?
- 18. 如何检查上传的文件是否是二进制文件?
- 19. 检查文件数据是否为二进制文件
- 20. 比较两个二进制文件
- 21. 是否可以将两个gobjects与haskell-gi进行比较,并确定它们是否相同?
- 22. 二进制比较
- 23. 如何检查lldb是否可以附加到二进制文件?
- 24. Objective C比较两个CGPoint以查看它们是否接近?
- 25. STLloader和three.js - 如何检查文件是二进制文件?
- 26. Powershell:如何比较2 $ xml变量以查看它们的xml内容是否相同?
- 27. VB.Net - 检查文件是否是.NET二进制
- 28. 在android中,比较两个文件以确定它们是否相同的最有效方法是什么?
- 29. 如何比较BigDecimal数字以查看它是否是整数
- 30. 如何比较最新的两个文件是否相同或不相同?
一个问题显示*他们有什么不同:http://superuser.com/questions/125376/how-do-i-compare-binary-files-in-linux –
'cmp'的手册页专门针对说它做逐字节比较,所以这是我的2个二进制文件的默认值。 'diff'是一行一行,并会给你相同的是/否回答,但当然不是标准输出流的相同转储。如果行很长,因为它们可能不是文本文件,那么我宁愿'cmp'。 'diff'的优点是你可以指定一个目录和'-r'的递归比较,从而比较一个命令中的多个文件。 – H2ONaCl