区分多个文件,如果不相等则为true


18

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

我可以使用哪个命令行来检查?

用法可能类似于:

$ diffseveral file1 file2 file3 file4

结果:

All files equals

要么

Files are not all equals

Answers:


27

使用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

4

怎么样:

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}'

无需排序,因为我们只是在检查是否有任何不同。


1
在较短的版本中,我猜应该使用$ 1,因为$ 0包含唯一的文件名。
xanpeng 2012年

2

下面的代码应该很容易解释。 $#是文件参数的数量,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

0

您一次只能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

如果您有五十个文件,或者不知道有多少个文件,比较笨拙
DarenW

1
@DarenW当然,如果有那么多,请使用循环。
凯文(Kevin)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.