2009-06-04 115 views
4

假设我有两个文件A和B,并且lengthOf(A)< lengthOf(B)。是否有一个unix实用程序来判断文件B是否为第一个lengthOf(A)个字节复制了文件A?比较unix命令行上的文件

如果我做了“diff A B”,那么输出将是B文件中所有'额外的东西',它会错过点;我不在乎文件B中还有什么可能。

如果我做“comm A B”,那么我必须目视检查“列在A中”的列没有任何内容。当lengthOf(B)>> lengthOf(A)时,虽然我想它可以用grep驯服,但这可能很困难。

回答

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` 
+0

+1:不错的一个!也许你可以添加一条关于如何测试存在状态'echo $?'的行或者其他的东西 :) – xk0der 2009-06-04 16:07:28

-2

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

3

使用head -c指定每个文件的字节数,然后比较它们。

我相信这需要创建至少一个临时文件,但原本欣赏任何意见:)

也许创建具有适当内容的临时文件B到的长度
+0

可以使用“ - '争执差异。这实际上意味着“打开stdin”:'head -c 100 a | diff-b'这将比较a中的前100个字节到全部b。 – 2009-08-07 11:28:19

1

几分邪气,但是:

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 -