Diff beberapa file, benar jika semuanya tidak sama

18

Saya memiliki sejumlah file, saya ingin memeriksa bahwa semua file tersebut memiliki konten yang sama.

Baris perintah apa yang bisa saya gunakan untuk memeriksa itu?

Penggunaan bisa berupa:

$ diffseveral file1 file2 file3 file4

Hasil:

All files equals

ATAU

Files are not all equals
Nicolas Raoul
sumber

Jawaban:

27

Dengan GNU diff, operkan salah satu file sebagai argumen --from-filedan sejumlah lainnya sebagai operan:

$ 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
Gilles 'SANGAT berhenti menjadi jahat'
sumber
4

Bagaimana tentang:

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

Hitung nilai MD5 untuk setiap file, lalu bandingkan setiap entri dengan yang berikutnya, jika ada yang berbeda, lalu kembalikan status keluar nol (benar). Ini akan jauh lebih pendek jika dikembalikan false jika berbeda:

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

Tidak perlu menyortir karena kami hanya memeriksa apakah ada yang berbeda.

Arcege
sumber
1
Dalam versi yang lebih pendek, saya kira $ 1 harus digunakan, karena $ 0 berisi nama file yang unik.
xanpeng
2

Kode berikut harus cukup jelas. $#adalah jumlah argumen file, dan shifthanya mengkonsumsinya satu per satu. Menggunakan cmp -sperbandingan diam-bijaksana byte.

#!/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
jw013
sumber
0

Anda hanya dapat melakukan diffdua sekaligus, tetapi cukup mudah untuk memeriksa apakah semuanya sama:

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

Jika Anda memiliki cukup untuk membenarkan loop, gunakan sesuatu seperti ini:

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
Kevin
sumber
Kikuk jika Anda memiliki lima puluh file, atau tidak tahu berapa banyak
DarenW
1
@ DarenW Tentu, jika Anda memiliki banyak hanya menggunakan satu lingkaran.
Kevin