คำตอบของ@derobertนั้นยอดเยี่ยมถึงแม้ว่าฉันต้องการแบ่งปันข้อมูลอื่น ๆ ที่ฉันได้พบ
gzip -l -v
ไฟล์บีบอัด gzip มีแฮชอยู่แล้ว (ไม่ปลอดภัยดูที่โพสต์ SO ):
$ echo something > foo
$ gzip foo
$ gzip -v -l foo.gz
method crc date time compressed uncompressed ratio uncompressed_name
defla 18b1f736 Feb 8 22:34 34 10 -20.0% foo
หนึ่งสามารถรวม CRC และขนาดที่ไม่บีบอัดเพื่อให้ได้ลายนิ้วมือที่รวดเร็ว:
gzip -v -l foo.gz | awk '{print $2, $7}'
CMP
cmp file1 file2
สำหรับการตรวจสอบว่าไบต์ที่สองมีค่าเท่ากันหรือไม่ใช้ ตอนนี้ไฟล์ gzipped มีส่วนหัวที่มีข้อมูลและส่วนท้าย (CRC บวกขนาดดั้งเดิม) ต่อท้าย รายละเอียดของรูปแบบ gzipแสดงให้เห็นว่าส่วนหัวมีเวลาเมื่อไฟล์ถูกบีบอัดและว่าชื่อแฟ้มเป็นสตริง NUL สิ้นสุดที่ถูกผนวกหลังจากที่ส่วนหัว 10 ไบต์
ดังนั้นสมมติว่าชื่อไฟล์คงที่และใช้คำสั่งเดียวกัน ( gzip "$name"
) สามารถตรวจสอบว่าไฟล์สองไฟล์แตกต่างกันหรือไม่โดยใช้cmp
และข้ามไบต์แรกรวมถึงเวลา:
cmp -i 8 file1 file2
หมายเหตุ : ข้อสันนิษฐานว่าตัวเลือกการบีบอัดข้อมูลเดียวกันมีความสำคัญมิฉะนั้นคำสั่งจะรายงานไฟล์ที่แตกต่างเสมอ สิ่งนี้เกิดขึ้นเนื่องจากตัวเลือกการบีบอัดถูกเก็บไว้ในส่วนหัวและอาจส่งผลต่อข้อมูลที่บีบอัด cmp
เพียงแค่ดูที่ไบต์ดิบและไม่ตีความว่าเป็น gzip
หากคุณมีชื่อไฟล์ที่มีความยาวเท่ากันคุณสามารถลองคำนวณจำนวนไบต์ที่จะข้ามไปหลังจากอ่านชื่อไฟล์ เมื่อชื่อไฟล์ที่มีขนาดแตกต่างกันคุณสามารถเรียกใช้หลังจากข้ามไบต์เช่นcmp
cmp <(cut -b9- file1) <(cut -b10- file2)
zcmp
นี่เป็นวิธีที่ดีที่สุดที่จะไปแน่นอนมันบีบอัดข้อมูลและเริ่มเปรียบเทียบไบต์ด้วยcmp
(จริงๆนี่คือสิ่งที่ทำในzcmp
( zdiff
) shellscript)
One note, อย่ากลัวหมายเหตุต่อไปนี้ในหน้าคู่มือ:
เมื่อไฟล์ทั้งสองต้องไม่ถูกบีบอัดก่อนทำการเปรียบเทียบไฟล์ที่สองจะไม่ถูกบีบอัดเป็น / tmp ในกรณีอื่น ๆ ทั้งหมด zdiff และ zcmp ใช้ไปป์เท่านั้น
เมื่อคุณมี Bash ใหม่อย่างเพียงพอการบีบอัดจะไม่ใช้ไฟล์ชั่วคราวเพียงแค่ไปป์ หรืออย่างที่zdiff
บอกว่า:
# Reject Solaris 8's buggy /bin/bash 2.03.