Answers:
假设您file1
在变量中具有的大小,FILE1_SZ
并且您的head
实现支持(非标准)-c
选项:
if head -c "$FILE1_SZ" file2 | cmp -s - file1; then
echo "file1 is a prefix of file2"
else
echo "file1 is not a prefix of file2"
fi
cmp
了简单的字节到字节比较,并在发现差异时立即返回,而diff
text实用程序将使用复杂的算法来向您显示两个文件中您不需要关心的所有差异。
如果您的系统具有cmp
来自GNU 的命令diffutils
,则一种选择是
cmp -n 124665 file1 file2
比较两个文件的前124665个字节,并报告它们是否不同-或更一般地说,
cmp -n "$(wc -c < file1)" file1 file2
$(stat -c %s file1)
以字节为单位的大小会更好吗?是否wc
真的打开并处理了整个文件以获得字节数?
wc
实现都会优化这种情况并执行一个fstat()
(或/和一个lseek(SEEK_END)
),因此将尽可能高效。另一方面,这stat -c
是GNU特定的。
cmp
,则可以合理地假设特定于GNU的代码stat
。
GNU cmp
可以通过一种更简单的方式解决问题:
cmp file1 file2
有四个可能的输出(除非出现某种错误)。
无输出:文件相同。
cmp: EOF on file1
:file1是file2的前缀。
cmp: EOF on file2
:file2是file1的前缀。
file1 file2 differ: byte NNN, line MMM
:两者都不是另一个的前缀。
不幸的是,这在脚本中使用有点尴尬,因为这些情况在退出代码中似乎没有区别。此外,EOF on file1
消息转到stderr,而file1 file2 differ
消息转到stdout。
我认为其他版本的软件cmp
也可以执行类似的操作,但我尚未检查。
cmp
它不是仅用于GNU的命令,也不是起源于此的命令,它早在70年代初就已出现在Unix的第一个版本中。该-n
选项是特定于GNU的。
cmp file1 file2 2>&1 | grep EOF on file1
cmp
是GNU所独有的,只是GNU cmp
是我尝试过的唯一版本。我加了一句话来澄清。
file1
,另一个名为file12
。(或者更糟糕的是,如果第二个文件被命名EOF on file1
为该怎么办?)与使用cmp
C语言编写明显的5行程序相比,健壮地解决此问题可能要麻烦得多……
cmp
受到了如此严格的限制。使用-x
选项on grep
匹配整行将处理除最特殊情况以外的所有情况(例如,文件名中的换行符)。
cmp
会比diff
这里更好吗?