代码之家  ›  专栏  ›  技术社区  ›  JustJeff

比较unix命令行上的文件

  •  4
  • JustJeff  · 技术社区  · 17 年前

    假设我有两个文件,a和b,以及lengthof(a)<lengthof(b)。是否有一个Unix实用程序来判断文件B是否在第一个长度(A)字节中复制了文件A?

    如果我执行“diff a b”,输出将是b文件中的所有“额外内容”,这忽略了要点;我不关心文件b中还有什么。

    如果我做“comm a b”,那么我必须目视检查栏中没有出现“only in a”的内容。当lengthof(b)>>lengthof(a)时,这可能很困难,不过我想可以用grep来驯服它。

    5 回复  |  直到 17 年前
        1
  •  5
  •   adomas    17 年前

    这似乎比创建临时文件要好得多:

    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`
    
        2
  •  3
  •   cgp    17 年前

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

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

        3
  •  1
  •   Douglas Leeder    17 年前

    可能创建一个临时文件,其中b的适当内容为a的长度?

    有点邪恶,但是:

    SIZE=`stat -c %s filea`
    head -c$SIZE fileb >tempfile
    diff filea tempfile
    EXIT=$?
    rm tempfile
    exit $EXIT
    
        4
  •  1
  •   Dolphin    17 年前
    head -c`stat -c %s filea` fileb |diff -q filea -
    
        5
  •  -2
  •   foobarfuzzbizz    17 年前

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