比较多个文件,如果不相等则为 true

比较多个文件,如果不相等则为 true

我有很多文件,我想检查所有这些文件是否具有相同的内容。

我可以使用什么命令行来检查?

用法可能是这样的:

$ diffseveral file1 file2 file3 file4

结果:

All files equals

或者

Files are not all equals

答案1

使用 GNU diff,将其中一个文件作为参数传递给,--from-file并将任意数量的其他文件作为操作数传递:

$ diff -q --from-file file1 file2 file3 file4; echo $?
0
$ echo >>file3
$ diff -q --from-file file1 file2 file3 file4; echo $?
Files file1 and file3 differ
1

您可以像往常一样使用通配符。例如,如果当前目录包含file1file2file3file4,则以下示例将file2file3file4与进行比较file1

$ diff -q --from-file file*; echo $?

请注意,“from file”必须是常规文件,而不是管道,因为 diff 会多次读取它。

答案2

怎么样:

md5sum * | awk 'BEGIN{rc=1}NR>1&&$1!=last{rc=0}{last=$1}END{exit rc}'

计算每个文件的 MD5 值,然后将每个条目与下一个条目进行比较,如果有不同,则返回零(真)退出状态。如果不同则返回 false,这会短得多:

md5sum * | awk 'NR>1&&$1!=last{exit 1}{last=$1}'

不需要排序,因为我们只是检查是否有不同。

答案3

下面的代码应该是相当不言自明的。 $#是文件参数的数量,shift一次只消耗一个。用于cmp -s静默字节比较。

#!/bin/sh
# diffseveral

if [ $# -lt 2 ]; then
    printf '%s\n' "Usage: $0 file1 file2 [files ...]" >&2
    exit 2
fi

oldfile="$1"
shift

while [ $# -gt 0 ]; do
    newfile="$1"
    if ! cmp -s "$oldfile" "$newfile"; then
         echo 'Files differ.'
         exit 1;
    fi

    shift
done

echo 'All files identical.'
exit 0

答案4

diff您一次只能使用两个,但检查它们是否都相等相当容易:

if diff file1 file2 && diff file2 file3 && diff file3 file4; then
    echo All equal
else
    echo Not
fi

如果您有足够的理由证明循环合理,请使用如下内容:

alleq () {  
    for file; do 
        diff -q "$1" "$file" >/dev/null || return 1
    done
}

if alleq file1 file2 ...; then
    echo All equal
else 
    echo Not
fi

相关内容