กระจายหลายไฟล์จริงถ้าไม่เท่ากันทั้งหมด


18

ฉันมีไฟล์จำนวนหนึ่งฉันต้องการตรวจสอบว่าไฟล์เหล่านั้นมีเนื้อหาเดียวกัน

บรรทัดคำสั่งอะไรที่ฉันสามารถใช้เพื่อตรวจสอบสิ่งนั้น

การใช้งานอาจเป็นสิ่งที่ชอบ:

$ diffseveral file1 file2 file3 file4

ผลลัพธ์:

All files equals

หรือ

Files are not all equals

คำตอบ:


27

ด้วย GNU diff ให้ส่งไฟล์หนึ่งไฟล์เป็นอาร์กิวเมนต์ไปยัง--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 สำหรับแต่ละไฟล์จากนั้นเปรียบเทียบแต่ละรายการกับรายการถัดไปหากมีความแตกต่างจากนั้นส่งคืนสถานะทางออกเป็นศูนย์ (จริง) นี่จะสั้นกว่านี้มากหากมันคืนค่าเท็จถ้าต่างกัน:

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

ไม่จำเป็นต้องเรียงลำดับเนื่องจากเราเพียงตรวจสอบว่ามีความแตกต่าง


1
ในรุ่นที่สั้นกว่าฉันเดาว่าควรใช้ $ 1 เนื่องจาก $ 0 มีชื่อไฟล์ที่ไม่ซ้ำ
xanpeng

2

รหัสต่อไปนี้ควรอธิบายด้วยตนเองอย่างเป็นธรรม $#คือจำนวนอาร์กิวเมนต์ไฟล์และshiftกินครั้งละหนึ่งไฟล์ ใช้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สองครั้งเท่านั้น แต่มันค่อนข้างง่ายที่จะตรวจสอบว่ามันเท่ากันหรือไม่:

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

เงอะงะถ้าคุณมีห้าสิบไฟล์หรือไม่รู้ว่ามีกี่ไฟล์
DarenW

1
@ DarenW แน่นอนว่าถ้าคุณมีหลายคนก็แค่ใช้วงวน
เควิน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.