Shell 确定文件 `foo` 是否是文件 `bar` 的截断命令
Shell command to determine if file `foo` is a truncation of file `bar`
假设我有两个文件,foo
和 bar
。如果我想验证它们具有相同的内容,我可以 运行:
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
比较file1
和file2
的前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
假设我有两个文件,foo
和 bar
。如果我想验证它们具有相同的内容,我可以 运行:
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
比较file1
和file2
的前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