2012-08-25 81 views
92

什么是最简单的方法(在Ubuntu Linux上使用图形工具或命令行)知道两个二进制文件是否相同(时间戳除外)?我不需要真正提取差异。我只需要知道他们是否相同。如何比较二进制文件以检查它们是否相同?

+2

一个问题显示*他们有什么不同:http://superuser.com/questions/125376/how-do-i-compare-binary-files-in-linux –

+1

'cmp'的手册页专门针对说它做逐字节比较,所以这是我的2个二进制文件的默认值。 'diff'是一行一行,并会给你相同的是/否回答,但当然不是标准输出流的相同转储。如果行很长,因为它们可能不是文本文件,那么我宁愿'cmp'。 'diff'的优点是你可以指定一个目录和'-r'的递归比较,从而比较一个命令中的多个文件。 – H2ONaCl

回答

90

标准的UNIX diff将显示,如果这些文件是相同的或不:

[[email protected] ~]$ diff 1.bin 2.bin 
Binary files 1.bin and 2.bin differ 

如果没有从该命令的输出,这意味着该文件没有区别。

+11

如果我没有从'diff'得到输出,这意味着这些文件是相同的? – becko

+14

这是正确的 - 没有输出意味着它们是相同的 – JWDN

+1

差异似乎有*真正大*文件的问题。比较两个13G文件时,我得到了'diff:memory exhausted'。 –

14

使用SHA1生成校验:

sha1 [FILENAME1] 
sha1 [FILENAME2] 
+0

如果你只有一个文件的校验和,这将是有用的,但如果你有两个文件在磁盘上,这是不必要的。 'diff'和'cmp'都会告诉你它们是否有差异而没有额外的努力。 – johncip

+0

是不是'sha1sum'而不是'sha1'? – kol

+1

在NetBSD上的sha1,在Linux上的sha1sum –

67

使用cmp命令。如果它们是二进制平等的,它将或者干净地退出,或者它将打印出发生第一次差异并退出的位置。通过MacPortsport install vbindiff

+4

对于OP描述的用例,恕我直言'cmp'比'diff'更高效。所以我更喜欢这个。 – halloleo

+2

我有一个shell脚本运行:'cmp $ 1 $ 2 && echo“identical”|| echo“different”' – steveha

+1

当它找到第一个区别时,cmp会停止并显示它,否则它会通过文件的结尾? – sop

46

我发现Visual Binary Diff就是我一直在寻找,可在:

  • Ubuntu的:apt-get install vbindiff
  • 的Mac OS X。
  • 的Mac OS X:brew install vbindiff通过自制
+0

不错......我想/我只想知道文件是否有差异;但能够轻松看到确切的差异更有用。当我到达文件末尾时,它倾向于段错误,但是没关系,它仍然有效。 – Jeremy

+0

伟大的工具和很好的答案。正在寻找那 – Anwar

+1

有人说了几次,但这是一个伟大的小程序! (fyi也是自制的) – johncip

5

使用cmp命令。有关更多信息,请参阅Binary Files and Forcing Text Comparisons

cmp -b file1 file2 
+1

'-b'不会比较文件“二进制模式”。它实际上“使用GNU'cmp',你也可以使用'-b'或'--print-bytes'选项来显示这些字节的ASCII表示。”这正是我用URL提供的手册找到的。 –

+0

Victor Yarema,我不知道你的意思是“二元模式”。在我看来,'cmp'本质上是一个二元比较。 '-b'选项仅打印不同的第一个字节。 – H2ONaCl

3

为了找到闪存的缺陷,我不得不写这个脚本,其示出包含所有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分钟内破解了该脚本。它不支持命令行参数,也不支持空格的文件名

+1

真棒剧本老兄! – pmargreff

+0

我得到“r:找不到”(使用GNU linux) –

+0

@unseen_rider哪个shell,哪一行?请使用'sh -x'调用脚本进行调试 –

3

md5 <filename1>

md5 <filename2>

看看它们是相同的:-)

+4

你能解释你的倒票吗? SHA1有4个upvotes,如果OP认为有两个文件可能是相同或相似的机会,碰撞的机会是轻微的,不值得MD5投票,但投票SHA1以外,因为你听说你应该哈希你密码与SHA1而不是MD5(这是一个不同的问题)。 – Rikki

+1

不确定的原因,但纯cmp将比计算文件的任何散列函数和比较它们(至少只有2个文件) –

+1

,如果两个文件很大,并在同一磁盘(不ssd),效率md5或sha *变种可能会更快,因为磁盘可以顺序读取这两个文件,从而节省大量头部移动 –

7

我结束了使用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 
+1

如果您想要比较并确切地看到哪些字节被插入或删除,请使用'hexdump -v -e'/ 1“%02x \ n”'''。 –

4

DIFF与下列选项会做一个二进制比较来检查只是如果文件是不同的,在一切,它会输出,如果文件是相同的还有:

diff -qs {file1} {file2} 

如果您是比较在不同的目录中的两个同名文件,你可以改用此表单:

diff -qs {file1} --to-file={dir2} 

OS X埃尔卡皮坦

1

尝试差异-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 
相关问题