在Unix命令行中比较文件

4
假设我有两个文件A和B,且lengthOf(A) < lengthOf(B)。是否有一种Unix实用工具可以告诉我文件B是否在前lengthOf(A)字节中重复了文件A?
如果我执行“diff A B”,输出将是B文件中的所有“额外内容”,这与我的要求无关;我不关心文件B中可能还有什么其他内容。
如果我执行“comm A B”,那么我必须目视检查“只在A中”的列中是否没有出现任何内容。当lengthOf(B) >> lengthOf(A)时,这可能会很困难,尽管我认为它可以通过grep来解决。
5个回答

5

这比创建临时文件好多了:

SIZE=`stat -c %s filea`
cmp -s -n $SIZE filea fileb # -s for silence

检查退出状态以确定这些文件的前几个字节是否相等。

更新:根据xk0der的要求,这里提供一个更长的示例:

wormhole:tmp admp$ echo -n "fooa" > one # -n to supress newline
wormhole:tmp admp$ echo -n "foobc" > two
wormhole:tmp admp$ SIZE=`stat -c %s one`
wormhole:tmp admp$ echo $SIZE
4
wormhole:tmp admp$ (cmp -s -n $SIZE one two && echo "equal") || echo "not equal"
not equal
wormhole:tmp admp$ echo -n "fooac" > two # first 4 bytes are equal now
wormhole:tmp admp$ (cmp -s -n $SIZE one two && echo "equal") || echo "not equal"
equal

此外,在MacOS X中,您需要使用以下命令:
SIZE=`stat -f %z filename`

+1:不错!也许你可以添加一行关于如何测试存在状态“echo $?”或其他内容 :) - xk0der

3

使用head -c命令指定每个文件的字节数,然后进行比较。

我认为这需要创建至少一个临时文件,但如果有其他建议,将不胜感激 :)


你可以使用“-”参数来进行差异比较。这实际上是指“打开标准输入”:head -c 100 a| diff - b。这将比较a中的前100个字节和b中的所有内容。 - Nathan Fellman

1
也许可以创建一个临时文件,将b的内容适当地补齐到a的长度?有点邪恶,但是:
SIZE=`stat -c %s filea`
head -c$SIZE fileb >tempfile
diff filea tempfile
EXIT=$?
rm tempfile
exit $EXIT

1
head -c`stat -c %s filea` fileb |diff -q filea -

-2

为此编写一个自定义的awk脚本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接