ฉันมีไฟล์จำนวนหนึ่งฉันต้องการตรวจสอบว่าไฟล์เหล่านั้นมีเนื้อหาเดียวกัน
บรรทัดคำสั่งอะไรที่ฉันสามารถใช้เพื่อตรวจสอบสิ่งนั้น
การใช้งานอาจเป็นสิ่งที่ชอบ:
$ diffseveral file1 file2 file3 file4
ผลลัพธ์:
All files equals
หรือ
Files are not all equals
ฉันมีไฟล์จำนวนหนึ่งฉันต้องการตรวจสอบว่าไฟล์เหล่านั้นมีเนื้อหาเดียวกัน
บรรทัดคำสั่งอะไรที่ฉันสามารถใช้เพื่อตรวจสอบสิ่งนั้น
การใช้งานอาจเป็นสิ่งที่ชอบ:
$ diffseveral file1 file2 file3 file4
ผลลัพธ์:
All files equals
หรือ
Files are not all equals
คำตอบ:
ด้วย 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
เกี่ยวกับ:
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}'
ไม่จำเป็นต้องเรียงลำดับเนื่องจากเราเพียงตรวจสอบว่ามีความแตกต่าง
รหัสต่อไปนี้ควรอธิบายด้วยตนเองอย่างเป็นธรรม $#คือจำนวนอาร์กิวเมนต์ไฟล์และ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
คุณสามารถทำได้ทีละ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