Nhiều tệp khác nhau, đúng nếu tất cả không bằng nhau


18

Tôi có một số tệp, tôi muốn kiểm tra xem tất cả các tệp đó có cùng nội dung hay không.

Tôi có thể sử dụng dòng lệnh nào để kiểm tra điều đó?

Cách sử dụng có thể là một cái gì đó như:

$ diffseveral file1 file2 file3 file4

Kết quả:

All files equals

HOẶC LÀ

Files are not all equals

Câu trả lời:


27

Với GNU diff, truyền một trong các tệp làm đối số --from-filevà bất kỳ số lượng nào khác làm toán hạng:

$ 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

Làm thế nào về:

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

Tính giá trị MD5 cho mỗi tệp, sau đó so sánh từng mục nhập với mục tiếp theo, nếu có khác nhau, thì trả về trạng thái thoát không (đúng). Điều này sẽ ngắn hơn nhiều nếu nó trả về false nếu khác:

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

Không cần phải sắp xếp vì chúng tôi chỉ kiểm tra xem có khác không.


1
Trong phiên bản ngắn hơn, tôi đoán $ 1 nên được sử dụng, vì $ 0 chứa tên tệp là duy nhất.
xanpeng

2

Các mã sau đây nên khá tự giải thích. $#là số lượng đối số tệp và shiftchỉ tiêu thụ chúng một lần. Sử dụng cmp -sđể so sánh byte-khôn ngoan im lặng.

#!/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

Bạn chỉ có thể diffhai lần một lần, nhưng khá dễ dàng để kiểm tra xem tất cả chúng có bằng nhau không:

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

Nếu bạn có đủ để biện minh cho một vòng lặp, hãy sử dụng một cái gì đó như thế này:

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

Vụng về nếu bạn có năm mươi tập tin, hoặc không biết có bao nhiêu
DarenW

1
@DarenW Chắc chắn, nếu bạn có nhiều người chỉ cần sử dụng một vòng lặp.
Kevin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.