ทดสอบความสมบูรณ์ของไฟล์ ZIP หรือไม่


21

ใกล้เท่าที่ฉันสามารถบอกตัวเลือก zip -T จะกำหนดได้ว่าสามารถแตกไฟล์ได้หรือไม่ - มันไม่ได้ทดสอบการจัดเก็บลงสื่อถาวรสำหรับความสมบูรณ์ภายใน ตัวอย่างเช่นฉันจงใจทำลาย CRC ในระบบ (ไม่ใช่ไดเรกทอรีกลาง) สำหรับไฟล์และ zip ไม่สนใจเลยรายงานว่าไฟล์เก็บถาวรเป็น OK มีสาธารณูปโภคอื่นให้ทำเช่นนี้หรือไม่

มีความซ้ำซ้อนภายในจำนวนมากในไฟล์ ZIP และมันก็ดีที่มีวิธีการตรวจสอบทั้งหมด แน่นอนว่าโดยปกติแล้วไดเรกทอรีกลางคือสิ่งที่คุณต้องการ แต่เมื่อซ่อมแซมไฟล์เก็บถาวรที่เสียหายบ่อยครั้งที่สิ่งที่คุณมีคือแฟรกเมนต์โดยที่ไดเรกทอรีกลางจะถูกบดบังหรือขาดหายไป ฉันต้องการทราบว่าคลังเก็บถาวรที่ฉันสร้างนั้นสามารถกู้คืนได้หรือไม่


2
เกี่ยวกับunzip -tอะไร
FloHim เอง

พฤติกรรมเช่นเดียวกับรหัสไปรษณีย์
Marc Rochkind

คำตอบ:


20

เปิดเครื่องรูด -t

ทดสอบไฟล์เก็บถาวร

ตัวเลือกนี้จะแยกแต่ละไฟล์ที่ระบุในหน่วยความจำและเปรียบเทียบ CRC (การตรวจสอบความซ้ำซ้อนแบบวนซ้ำ, การตรวจสอบขั้นสูง) ของไฟล์ที่ขยายเพิ่มด้วยค่า CRC ที่เก็บไว้ดั้งเดิม

[แหล่งที่มา: https://linux.die.net/man/1/unzip ]


มี 2 ​​CRCs ต่อไฟล์: ท้องถิ่นและส่วนกลาง unzip -tทดสอบหลังเท่านั้น
Marc Rochkind

2
ฉันไม่ทราบว่าคุณหมายถึงอะไรโดย "ท้องถิ่น" กับ "กลาง" (กลางถึงอะไร?) แต่เมื่อฉันเรียกใช้ "unzip -t myzip_file.zip" ฉันเห็นบรรทัดเอาท์พุทสำหรับการแสดงความคิดเห็นในความสมบูรณ์ของแต่ละไฟล์ซิป , like (ลองนึกภาพการจัดรูปแบบที่ดีกว่า): "การทดสอบ: AARiseTransitSet.cpp การทดสอบที่ตกลง: AARiseTransitSet.h การทดสอบที่ตกลง: AASaturn.cpp การทดสอบ OK: AASaturn.h ตกลง ...
Theophrastus

ไม่ใช่ที่สำหรับอธิบายโครงสร้างภายในของไฟล์ ZIP บทความ Wikepedia ค่อนข้างดีในเรื่องนี้ ดังที่ฉันได้กล่าวไว้มันเป็นรายงานที่ทำให้เข้าใจผิดที่คุณเห็น
Marc Rochkind

หากฉันเข้าไปในไฟล์ zip ด้วย hex-editor และเปลี่ยนหนึ่งไบต์ฉันจะเห็นไฟล์หนึ่งไฟล์: การทดสอบ: AA_sphere.htm CRC 7952862e ไม่ดี CRC 7952862e (ควรเป็น 44c6f7f8) ในขณะที่ส่วนที่เหลือจะแสดงรายการเป็น "OK" คุณจะประกาศว่า "เข้าใจผิด" ต่อไป แต่นี่คือสิ่งที่ฉันคาดหวังสำหรับการตรวจสอบไฟล์ CRC แบบไฟล์ต่อไฟล์ของไฟล์ซิป ตอนนี้ ... ขอให้คุณโชคดี
Theophrastus

ฉันคิดว่าคุณได้เปลี่ยนไดเรกทอรีกลาง CRC ในตอนท้าย ลองเปลี่ยนโลคัลก่อนหรือหลังไฟล์
Marc Rochkind

12

ความพยายามในการแก้ไขการเก็บถาวรจะเปรียบเทียบ CRC ในพื้นที่และส่วนกลางและการรวมกับการทดสอบที่เก็บถาวรจะอนุญาตให้ตรวจสอบ CRC ทั้งหมด ถ้าคุณวิ่ง

unzip -t archive.zip

และ

zip -F archive.zip --out archivefix.zip

และไม่บ่นนั่นหมายความว่าเนื้อหาของไฟล์เก็บถาวรตรงกับทั้ง CRC ส่วนกลางและท้องถิ่น (คุณสามารถลบได้ในarchivefix.zipภายหลัง)

เพื่อตรวจสอบสิ่งนี้เริ่มต้นด้วยซอร์สโค้ด Info-ZIP สำหรับzip3.0 ฉันสร้างไฟล์ดังนี้:

zip -9 test.zip zip.txt zipup.c

ฉันเสียหายไดเรกทอรีกลาง CRC สำหรับzip.txtโดยการเปลี่ยนไบต์ที่ offset 0xB137 ฉันมีพฤติกรรมตรงข้ามกับสิ่งที่คุณสังเกต unzip -vรายงาน CRC ที่ถูกเปลี่ยนแปลงจากไดเรกทอรีกลาง แต่unzip -tและzip -Tรายงานว่าไฟล์นั้นใช้ได้ (ตรวจสอบกับ CRC ท้องถิ่น)

แต่วิ่งได้

zip -F test --out testfix

รายงาน

Fix archive (-F) - assume mostly intact archive
Zip entry offsets do not need adjusting
 copying: zip.txt
        zip warning: Local Entry CRC does not match CD: zip.txt
 copying: zipup.c

"การแก้ไข" zip.txtแฟ้มยังคงจดทะเบียนเปลี่ยนแปลงสำหรับซีอาร์ซี

การแก้ไข CRC ในระบบสำหรับzip.txtออฟเซ็ต 0x10 ทำให้ทั้งคู่unzip -tและzip -Tรายงานข้อผิดพลาด CRC แต่zip -Fไม่พบสิ่งผิดปกติ

ดังนั้นจากการทดสอบของฉันไม่ตรงกันระหว่างเนื้อหาของรายการที่เก็บถาวรและ CRC ของมันสามารถตรวจพบได้ดังนี้:

  • ท้องถิ่นเท่านั้น: zip -Tและunzip -t; zip -Fจะบ่นเกี่ยวกับความไม่ตรงกันในพื้นที่ส่วนกลาง
  • ท้องถิ่นและส่วนกลาง: zip -Tและunzip -t
  • กลางเท่านั้น: zip -Tและunzip -tจะไม่บ่น แต่zip -Fจะบ่งบอกถึงความไม่ตรงกันในพื้นที่ส่วนกลาง

(หมายเหตุที่เริ่มต้นzip -Tเพียงแค่ใช้unzip -tqqเพื่อzip -Tและunzip -tจริงๆเทียบเท่าคุณสามารถอ่าน. unzipรหัสแหล่งที่มาเพื่อตรวจสอบว่าการทดสอบเก็บจริงๆเปรียบเทียบท้องถิ่นซีอาร์ซีไม่ได้เป็นศูนย์กลางหนึ่ง; มองหาextract_or_test_files(), extract_or_test_entrylist()และextract_or_test_member()ทั้งหมดในextract.c.)


ซับซ้อน. และไม่ต้องสงสัยเลยว่าขึ้นอยู่กับรุ่นใด (GNU, BSD, ฯลฯ ) และ CRC เป็นเพียงหนึ่งในการตรวจสอบความสมบูรณ์จำนวนมากที่สามารถดำเนินการได้
Marc Rochkind

1
มีไม่กี่เวอร์ชันzipและunzipมีให้บริการบนแพลตฟอร์มที่เหมือน Unix ข้อมูลไปรษณีย์จะใช้สวยมากทุกที่ ...
สตีเฟ่นกิต

1
เท่าที่มันซับซ้อนมันใช้เวลาเพียงสองคำสั่ง; หากทั้งสองunzip -tและzip -Fทำงานโดยไม่มีข้อผิดพลาดคุณจะตกลงและ CRC ทั้งสองได้รับการตรวจสอบแล้ว
Stephen Kitt

ขอบคุณ! จะตรวจสอบนี้ นอกจากนี้ยังลืมพูดถึง: ไฟล์ ZIP คือ ZIP64
Marc Rochkind
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.