複数のファイルを差分します。すべてが等しくない場合はtrue


18

いくつかのファイルがありますが、それらすべてのファイルが同じコンテンツを持っていることを確認したいと思います。

それを確認するためにどのコマンドラインを使用できますか?

使用方法は次のようになります。

$ diffseveral file1 file2 file3 file4

結果:

All files equals

または

Files are not all equals

回答:


27

GNU diffを使用して、ファイルの1つを引数として、--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値を計算し、各エントリが次のものと異なる場合は比較し、ゼロ(true)の終了ステータスを返します。異なる場合にfalseを返すと、これははるかに短くなります。

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

異なるものがあるかどうかを確認するだけなので、ソートする必要はありません。


1
短いバージョンでは、$ 0には一意のファイル名が含まれるため、$ 1を使用する必要があります。
ザンペン

2

次のコードはかなり自明です。 $#はファイル引数の数shiftであり、一度に1つずつ消費します。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一度に2つしか使用できませんが、それらがすべて等しいかどうかを確認するのは非常に簡単です。

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

50個のファイルがある場合、またはファイルの数がわからない場合は
扱いにくい

1
@DarenW確かに、ループを使用している人が多いなら。
ケビン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.