【问题标题】:Comparing files on the unix command line在 unix 命令行上比较文件
【发布时间】:2009-06-04 15:39:47
【问题描述】:

假设我有两个文件,A 和 B,并且 lengthOf(A)

如果我执行“diff A B”,则输出将是 B 文件中的所有“额外内容”,这没有抓住重点;我不在乎文件 B 中还有什么。

如果我执行“comm A B”,那么我必须目视检查“仅在 A”列中没有出现任何内容。当 lengthOf(B) >> lengthOf(A) 时,这可能会很困难,尽管我认为它可以用 grep 来驯服。

【问题讨论】:

    标签: unix command-line file


    【解决方案1】:

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

    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 $?'什么的:)
    【解决方案2】:

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

    我相信这需要创建至少一个临时文件,但如果有任何 cmets,我将不胜感激 :)

    【讨论】:

    • 您可以使用 '-' 参数来区分。这实际上意味着“打开标准输入”:head -c 100 a| diff - b 这会将 a 中的第一个 100 个字节与所有 b 进行比较。
    【解决方案3】:

    也许创建一个临时文件,其中 b 的适当内容与 a 的长度一致?

    有点邪恶,但是:

    SIZE=`stat -c %s filea`
    head -c$SIZE fileb >tempfile
    diff filea tempfile
    EXIT=$?
    rm tempfile
    exit $EXIT
    

    【讨论】:

      【解决方案4】:
      head -c`stat -c %s filea` fileb |diff -q filea -
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-16
          • 2011-09-22
          • 2015-05-10
          • 1970-01-01
          • 2013-03-24
          • 1970-01-01
          • 1970-01-01
          • 2015-04-28
          相关资源
          最近更新 更多