假设我有两个文件,foo
和bar
。如果我想验证它们有相同的内容,我可以运行:
diff -q foo bar
并检查退出代码是否为零。类似地,我可以对具有不同内容的文件执行相同的操作,并查找非零退出状态。
现在,假设文件foo
是500字节,文件bar
是几兆字节,但bar
的前500字节与整个文件foo
相同。有没有一个简单的命令来验证这种情况,最好不用解析大diff的输出?
如果文件都是二进制文件而不是文本文件,它会改变什么吗?
cmp
似乎是为这个而生的:
cmp -n $(stat -c %s file1) file1 file2
$(stat -c %s file1)
是file1
的大小,cmp -n 123 file1 file2
比较file1
和file2
的前123个字节。
我想你可以使用split
来获得文件的前N个字节,其中N是较小文件的长度,然后是diff
这些:
split -b "$(wc -c < foo)" bar out
diff -q foo outaa
正如smitelli在评论中指出的那样,split
生成的文件必须在之后进行清理。您可以使用类似rm out??
的东西来实现这一点(在我的系统中,后缀的默认长度是2个字符)。
我怀疑我们可以在这里使用cmp
命令。它只是检查第一次不匹配,并提供如下重试状态,
0 Files are identical.
1 Files are not identical.
2 Inaccessible or missing argument.
在我们的例子中,它给出消息"cmp:EOF on foo"并返回1。它比diff 快
您可以按字节顺序通过文件read
,类似于:
while read -n 1 -u 7 byte; do
read -n 1 -u 6 bite
if [ "$byte" != "$bite" ]; then
echo "Not a subset"
break
fi
done 6<big_file 7<small_file