回答:
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
どうですか:
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}'
異なるものがあるかどうかを確認するだけなので、ソートする必要はありません。
次のコードはかなり自明です。 $#
はファイル引数の数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
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