いくつかのファイルがありますが、それらすべてのファイルが同じ内容であることを確認したいと思います。
それを確認するためにどのコマンドラインを使用できますか?
使用法は次のようになります。
$ diffseveral file1 file2 file3 file4
結果:
All files equals
OR
Files are not all equals
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値を計算し、次に各エントリを次のエントリと比較し、異なる場合は、ゼロ(真)の終了ステータスを返します。異なる場合に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
一度に2つしか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