Shell命令来确定文件“foo”是否是文件“bar”的截断



假设我有两个文件,foobar。如果我想验证它们有相同的内容,我可以运行:

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比较file1file2的前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

相关内容

最新更新