ไฟล์ ZIP ที่สร้างด้วย GUI มีจำนวนไบต์มากกว่าไฟล์ ZIP ที่สร้างในเชลล์


15

ฉันสร้างไฟล์ZIPสองไฟล์ในไดเรกทอรีเดียวกัน หนึ่งกับ GUI, อื่น ๆ ด้วย:

$ zip -r alpha_cmd.zip Alpha

อัลฟาไดเรกทอรี 33.640 ล้านบาท 164 รายการ

ไฟล์ ZIP ที่สร้างโดย GUI มีขนาดใหญ่กว่าไฟล์ ZIP ที่สร้างขึ้นบนบรรทัดคำสั่ง 2,100 ไบต์

ทำไมไฟล์ ZIP ถึงถูกสร้างด้วย GUI ที่ใหญ่ขึ้น?

หมายเหตุ : แม้ว่าไฟล์ ZIP จะมีขนาดแตกต่างกันเมื่อคลายซิปไดเร็กทอรีของแต่ละไฟล์จะมีจำนวนไบต์เท่ากันทุกประการ โดยพื้นฐานแล้วฉันระแวดระวังเกี่ยวกับความไม่สอดคล้องที่อาจเกิดขึ้นจากการจัดการระบบไฟล์ของฉันกับ GUI และด้วยคำสั่งเชลล์


หนึ่งอาจมีไฟล์ที่มองไม่เห็นอื่น ๆ ไม่ได้?
Tetsujin

จากคำตอบ SUลองนี้ditto -ck --rsrc --sequesterRsrc --keepParent folder folder.zip
user151019

@ มาร์คฉันลืมที่จะตอบสนอง คำสั่ง "ditto" นั้นสร้างไฟล์เดียวกันกับ Finder และไฟล์ ditto / zip / "Finder ZIP" นั้นเป็นแพลตฟอร์มข้ามทั้งหมด ขอบคุณสำหรับเวลาและความพยายามของคุณ
david

คำตอบ:


20

การซิปจาก Finder จะเพิ่มโฟลเดอร์ __MACOSX ซึ่งมองไม่เห็นบน Macs ที่มีส้อมทรัพยากร OS X เช่นไอคอนที่กำหนดเองและเช่นนั้น จากวิกิพีเดีย :

resource fork เป็น fork หรือส่วนของไฟล์บนระบบปฏิบัติการ Apple Mac OS ที่ใช้เพื่อจัดเก็บข้อมูลที่มีโครงสร้างพร้อมกับข้อมูลที่ไม่มีโครงสร้างที่เก็บไว้ใน data fork ตัวแยกทรัพยากรเก็บข้อมูลในแบบฟอร์มเฉพาะที่มีรายละเอียดเช่นบิตแมปไอคอนรูปร่างของ windows คำจำกัดความของเมนูและเนื้อหาและรหัสแอปพลิเคชัน (รหัสเครื่อง) ตัวอย่างเช่นไฟล์ประมวลผลคำอาจเก็บข้อความไว้ใน data fork ในขณะที่เก็บรูปภาพที่ฝังไว้ใน fork ทรัพยากรของไฟล์เดียวกัน ตัวแยกทรัพยากรส่วนใหญ่จะใช้งานโดยไฟล์ที่เรียกทำงานได้ แต่ทุกไฟล์สามารถมีตัวแยกทรัพยากรได้


6
การแก้ไขเล็ก ๆ น้อย ๆ : มันไม่ได้เป็นเพียงแค่ส้อมทรัพยากร แต่เป็นเมตาดาต้าไฟล์ทุกชนิดที่รูปแบบซิปไม่ได้จัดการแบบดั้งเดิมเข้ารหัสในรูปแบบAppleDouble ซึ่งจะรวมถึงความคิดเห็นสปอตไลท์แท็กธงตัวค้นหาข้อมูลกักกันและอื่น ๆ รวมถึงส้อมทรัพยากร
Gordon Davisson

และฉันสงสัยว่าอะไรคือโฟลเดอร์ "__MACOSX" ในรหัสไปรษณีย์ส่วนใหญ่ ... ยิ่งคุณรู้มากขึ้นเอ๊ะ?
Ave

การอ้างอิงอื่นซึ่งอาจส่องสว่างคำตอบ: stackoverflow.com/questions/107903/…
DA Vincent

4

แม้ว่าสาเหตุหลักในกรณีนี้ (ตัวค้นหาเพิ่มสิ่งที่ซ่อนพิเศษตามที่ Empedocle กล่าว) ขนาดที่แตกต่างกันสำหรับ ZIP ของข้อมูลเดียวกันไม่ได้บ่งบอกถึงปัญหาเมื่อความแตกต่างของขนาดเป็นเศษส่วนของร้อยละ

การใช้งาน ZIP ที่แตกต่างกันอาจมีระดับการบีบอัดเริ่มต้นที่แตกต่างกัน (แลกเปลี่ยนระหว่างเวลา CPU และขนาดที่บันทึกไว้) หรือเพียงแค่มีรหัสที่แตกต่างกันที่ช่วยประหยัดการจับคู่มากขึ้นหรือน้อยลง

ตัวอย่างเช่น7-Zipมักจะสร้าง.zipไฟล์ที่เล็กกว่าโปรแกรม ZIP อื่น ๆ (และไม่ฉันไม่ได้พูดถึง.7zรูปแบบไฟล์ของตัวเองมันมีตัวบีบอัดไฟล์ ZIP ที่ดีกว่าด้วย)

zipcmpเป็นโปรแกรม cmdline ที่สามารถเปรียบเทียบไฟล์ ZIP เป็นค่าเริ่มต้นที่จะเปรียบเทียบเฉพาะไดเรกทอรี ZIP เพื่อตรวจสอบว่าไฟล์ทั้งหมดมีชื่อขนาดและCRCเดียวกัน หากเป็นกรณีนี้ไฟล์ ZIP ทั้งสองเกือบจะแน่นอนว่ามีเนื้อหาเหมือนกัน แต่เพียงบีบอัดแตกต่างกัน (หากขนาดที่บีบอัดแตกต่างกัน) ตราบใดที่ไฟล์ ZIP ไม่เสียหายแน่นอน ใช้unzip -t foo.zipเพื่อทดสอบไฟล์ ZIP สำหรับข้อผิดพลาดในการคลายบีบอัด CRC ที่ไม่ตรงกัน ฯลฯ


โฟลเดอร์ __MACOSX จะไม่ส่งผลกระทบต่อการคำนวณ CRC หรือไม่
Kent

1
ZIP เก็บ CRC แยกเนื้อหาที่ไม่บีบอัดของไฟล์บีบอัดแต่ละไฟล์ (ไม่เช่นนั้นด้วยเหตุผลสองประการ: ไดเรกทอรีมีไฟล์อื่น ๆ เท่านั้นไม่ใช่บล็อกของข้อมูลของตนเองและสอง CRCs ที่เก็บไว้ในเมตาดาต้า ZIP สำหรับแต่ละไฟล์แยกต่างหาก) ดังนั้นไฟล์ทั้งหมดที่เหมือนกันระหว่าง ไฟล์ ZIP สองไฟล์จะจับคู่ใน CRC และขนาดที่คลายการบีบอัด
Peter Cordes

@PeterCordes ความจริงที่ว่าการใช้งาน ZIP ที่แตกต่างกันสามารถสร้างขนาดไฟล์ที่แตกต่างกันเป็นสิ่งที่ฉันสนใจ ฉันรู้ว่าเชลล์สั่ง "/ usr / bin / zip" แต่เนื่องจาก Finder ให้ขนาดไฟล์ที่แตกต่างกันฉันจึงคิดว่า Finder ใช้ไฟล์ปฏิบัติการที่แตกต่างกันโดยสิ้นเชิง (และนั่นทำให้ฉันเสียใจ) ถ้าฉันรู้วิธีหยั่งรากและมีความกล้าหาญฉันจะย้าย "/ usr / bin / zip" ไปที่ "/ tmp" จากนั้นลองใช้ตัวค้นหา zip (และจะทำให้เกิดข้อผิดพลาดขึ้น) แต่ฉันต้องทำและไม่สามารถเสี่ยงกับการทำให้เครื่อง Mac ของฉันไม่เสถียร!
david

วิธีที่ปลอดภัยที่สุดในการแทนที่/usr/bin/zipด้วยเวอร์ชันอื่นจะเป็นการln /usr/bin/zip /usr/bin/zip.standard; mv new_zip /usr/bin/zipชั่วคราว ด้วยวิธีนี้คุณมีเสมอ/usr/bin/zipเพราะคุณแทนที่การใช้งานระบบตามปกติ นอกจากนี้เวอร์ชันเก่าเพิ่งเปลี่ยนชื่อไม่ได้ย้ายไปที่/tmp(ซึ่งอาจเป็นระบบไฟล์ที่แตกต่างกัน) หากต้องการปิดใช้งานฉันจะเปลี่ยนชื่อเป็นzip.disabดูว่าตัวแบ่ง Finder แล้วเปลี่ยนชื่อกลับหรือไม่ แต่ฟังก์ชั่นห้องสมุดสร้างซิปเป็นเรื่องธรรมดา Finder เกือบจะแน่นอนไม่ส้อม / /usr/bin/zipexec
Peter Cordes

@PeterCordes ฉันได้รับมันเกี่ยวกับการเรียกไลบรารี่แทนการปฏิบัติการ แต่ไฟล์ปฏิบัติการจะเป็น "/ usr / bin / ditto" และไม่ใช่ "/ usr / bin / zip" อยู่ดี ความช่วยเหลือจากฟอรัมนี้ดีมาก ขอบคุณสำหรับเวลาและความพยายามของคุณ
david
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.