知道两个二进制文件是否相同(时间戳除外)的最简单方法(在Ubuntu Linux上使用图形工具或命令行)是什么?我不需要实际提取差异。我只需要知道它们是否相同即可。
cmp
专门说它进行逐字节比较,因此这是我默认的2个二进制文件。diff
是逐行的,将为您提供相同的是/否答案,但当然不是相同的转储到标准输出流。如果行很长,因为它们可能不是文本文件,那么我会更喜欢cmp
。diff
具有的优点是您可以指定目录和-r
for 的比较,以进行递归,从而在一个命令中比较多个文件。
知道两个二进制文件是否相同(时间戳除外)的最简单方法(在Ubuntu Linux上使用图形工具或命令行)是什么?我不需要实际提取差异。我只需要知道它们是否相同即可。
cmp
专门说它进行逐字节比较,因此这是我默认的2个二进制文件。diff
是逐行的,将为您提供相同的是/否答案,但当然不是相同的转储到标准输出流。如果行很长,因为它们可能不是文本文件,那么我会更喜欢cmp
。diff
具有的优点是您可以指定目录和-r
for 的比较,以进行递归,从而在一个命令中比较多个文件。
Answers:
标准的Unix diff
将显示文件是否相同:
[me@host ~]$ diff 1.bin 2.bin
Binary files 1.bin and 2.bin differ
如果命令没有输出,则表示文件没有差异。
diff: memory exhausted
比较两个13G文件时得到一个。
diff
告诉您它们是“二进制” fies。由于所有文件都可以视为二进制文件,因此这是一个奇怪的断言。
diff -s 1.bin 2.bin
或diff --report-identical-files 1.bin 2.bin
这显示Files 1.bin and 2.bin are identical
使用cmp
命令。如果它们是二进制相等的,它将干净地退出,或者将打印出出现第一个差异的位置并退出。
cmp
的效率更高diff
。所以我更喜欢这个。
cmp $1 $2 && echo "identical" || echo "different"
cmp
具有“静音”模式:-s, --quiet, --silent
- suppress all normal output
。我尚未测试,但我认为如果有第一个差异,它将停止。
我发现Visual Binary Diff是我要找的东西,可在以下位置找到:
Ubuntu:
sudo apt install vbindiff
Arch Linux:
sudo pacman -S vbindiff
通过MacPorts的 Mac OS X :
port install vbindiff
通过Homebrew的Mac OS X:
brew install vbindiff
使用sha1生成校验和:
sha1 [FILENAME1]
sha1 [FILENAME2]
diff
并cmp
会不费吹灰之力就告诉您它们是否不同。
sha1sum
不是sha1
?
我最终使用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"'
如果要比较并确切地看到插入或删除了哪些字节,请使用。
您可以使用MD5哈希函数来检查两个文件是否相同,这样就不能从低层次看到差异,但是这是比较两个文件的快速方法。
md5 <filename1>
md5 <filename2>
如果两个MD5哈希(命令输出)相同,则两个文件没有不同。
使用cmp命令。有关更多信息,请参考二进制文件和强制文本比较。
cmp -b file1 file2
-b
不以“二进制模式”比较文件。它实际上是“使用GNU cmp
,您还可以使用-b
or --print-bytes
选项显示这些字节的ASCII表示形式。”。这正是我使用您提供的手册中的URL找到的。
cmp
在我看来,本质上是二进制比较。该-b
选项仅打印不同的第一个字节。
为了查找闪存缺陷,我必须编写此脚本来显示所有包含差异的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分钟内入侵了脚本。它不支持命令行参数,也不支持文件名中的空格
sh -x
调试
readlink -f $(which sh)
/bin/dash
。当前在pastebin上创建粘贴。
简短的答案:diff
用-s
开关运行。
长答案:请在下面阅读。
这是一个例子。首先创建两个具有随机二进制内容的文件:
$ 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
(或--report-identical-files
)开关使diff更冗长:
$ diff -s test1.bin copyoftest1.bin
Files test1.bin and copyoftest1.bin are identical
我最喜欢的使用vim包中的xxd hex-dumper:
1)使用vimdiff(vim的一部分)
#!/bin/bash
FILE1="$1"
FILE2="$2"
vimdiff <( xxd "$FILE1" ) <( xxd "$FILE2" )
2)使用差异
#!/bin/bash
FILE1=$1
FILE2=$2
diff -W 140 -y <( xxd $FILE1 ) <( xxd $FILE2 ) | colordiff | less -R -p ' \| '
md5sum binary1 binary2
如果md5sum相同,则二进制文件相同
例如
md5sum new*
89c60189c3fa7ab5c96ae121ec43bd4a new.txt
89c60189c3fa7ab5c96ae121ec43bd4a new1.txt
root@TinyDistro:~# cat new*
aa55 aa55 0000 8010 7738
aa55 aa55 0000 8010 7738
root@TinyDistro:~# cat new*
aa55 aa55 000 8010 7738
aa55 aa55 0000 8010 7738
root@TinyDistro:~# md5sum new*
4a7f86919d4ac00c6206e11fca462c6f new.txt
89c60189c3fa7ab5c96ae121ec43bd4a new1.txt
diff
,没有理由不喜欢它。
有一种相对简单的方法来检查两个二进制文件是否相同。
如果以编程语言使用文件输入/输出;您可以将两个二进制文件的每一位存储到它们自己的数组中。
此时检查很简单:
if(file1 != file2){
//do this
}else{
/do that
}