Shell 确定文件 `foo` 是否是文件 `bar` 的截断命令

Shell command to determine if file `foo` is a truncation of file `bar`

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

diff -q foo bar

并检查退出代码是否为零。同样,我可以对具有不同内容的文件执行相同的操作,并查找非零退出状态。

现在,假设在我们的案例中文件 foo 是 500 字节,文件 bar 是几兆字节——但是 bar 的前 500 字节与整个文件相同 foo。是否有一个简单的命令来验证这种情况,最好不要解析大差异的输出?

如果文件都是二进制文件而不是文本文件,它会改变什么吗?

我想你可以使用 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" 和 returns 1。 它比 diff

cmp 似乎是为此而生的:

cmp -n $(stat -c %s file1) file1 file2

$(stat -c %s file1)file1的大小,cmp -n 123 file1 file2比较file1file2的前123个字节。

您可以 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