วิธีรับการบีบอัดสูงสุดด้วย. tar.gz [ซ้ำ]


63

คำถามนี้มีคำตอบอยู่ที่นี่แล้ว:

วิธีที่ฉันเข้าใจการใช้ tar + gzip คือtarปกติแล้วจะใช้ในการรวมกลุ่มของไฟล์ไว้ในไฟล์เดียวจากนั้นgzipจะใช้ในการบีบอัดไฟล์นั้น

ฉันเพิ่งเรียนรู้ว่าtarยังสามารถบีบอัด

เนื่องจากฉันไม่เข้าใจวิธีการบีบอัดที่ @ เป็นหลักฉันมี (อาจน่าหัวเราะ) ที่กังวลว่าการส่ง. tar ที่บีบอัดล่วงหน้าไปยัง gzip อาจป้องกันไม่ให้ gzip บีบอัดรวมทั้งศักยภาพที่จะอนุญาตและสิ่งต่างๆในธรรมชาติ

คำถามของฉันคือ: การรวมกันของวิธีการ args / การบีบอัดฉันควรใช้เพื่อสร้าง tar.gz ที่เล็กที่สุดและคำสั่งบรรทัดคำสั่งมีลักษณะอย่างไร


2
การบีบอัดไฟล์ที่บีบอัดแล้วอาจลดขนาดไฟล์ลงหรือทำให้การเก็บถาวรใหญ่ขึ้น ทุกอย่างขึ้นอยู่กับประเภทของข้อมูลและการบีบอัดใด ๆ ที่ใช้
Keltari

สิ่งที่ @Keltari พูด อัตราการบีบอัดและอัตราส่วนจะขึ้นอยู่กับว่าคุณกำลังบีบอัดสูงเพียงใดซึ่งเป็นสาเหตุที่ทำให้มีอัลกอริทึมและวิธีการบีบอัดที่แตกต่างกัน
music2myear

คำตอบ:


111

หรือคุณสามารถบอก tar แก่ผู้ใช้ในการบีบอัดสูงสุดด้วยวิธีนี้:

export GZIP=-9
tar cvzf file.tar.gz /path/to/directory

นอกจากนี้เพื่อให้ envvars ของคุณปราศจากความยุ่งเหยิงคุณสามารถทำได้:

env GZIP=-9 tar cvzf file.tar.gz /path/to/directory

43

ในขณะที่คุณ stated- " tar สามารถยังบีบอัด " หมายความว่า - tarไม่เสมอบีบอัดข้อมูลด้วยตัวเอง

มันจะทำได้ก็ต่อเมื่อใช้กับzตัวเลือก นั่นไม่ใช่ด้วยตัวเอง แต่ - โดยการส่งข้อมูล tarred ผ่าน gzip

อย่างไรก็ตามดังที่ระบุไว้ในคำตอบนี้คุณสามารถไพพ์คำสั่งสองคำสั่ง: tar& gzipเช่นที่คุณสามารถระบุระดับการบีบอัดสำหรับgzipคำสั่งเพื่อให้ได้ขนาดเอาต์พุตที่เล็กที่สุด

tar cvf - / path / to / directory | gzip -9 -> file.tar.gz

ที่นี่9ระบุระดับการบีบอัดที่เป็นไปได้สูงสุด


ฉันมีปัญหาที่มันไม่เรียกซ้ำและบ่นว่ามันจะเป็นไฟล์เก็บถาวรที่ว่างเปล่าเนื่องจากคำสั่งถูกแยกมันยากที่จะหาวิธีการบังคับ recursive อย่างถูกต้องเนื่องจาก tar เริ่มต้นแล้ว MY BAD ฉันระบุผิดเริ่มต้นเช่นนี้tar -cvf /path
Brian Thomas

17

โดยปกติแล้วทั้ง gzip หรือ tar จะไม่สามารถสร้าง "tar.gz ที่เล็กที่สุดอย่างแน่นอน" ได้ มียูทิลิตีการบีบอัดมากมายที่สามารถบีบอัดให้อยู่ในรูปแบบ gz ฉันได้เขียนสคริปต์ทุบตี " gz99 " ที่จะลองgzip, 7zและadvdefจะได้รับไฟล์ที่เล็กที่สุด หากต้องการใช้สิ่งนี้เพื่อสร้างไฟล์ที่เล็กที่สุดเท่าที่จะเป็นไปได้ให้เรียกใช้:

tar c path/to/data | gz99 file.gz

advdefยูทิลิตี้จาก AdvanceCOMP จะให้ไฟล์ที่เล็กที่สุด แต่ยังเป็นรถ (คนgz99ยูทิลิตี้การตรวจสอบว่ามันยังไม่ได้เสียหายไฟล์ก่อนที่จะยอมรับการส่งออกของadvdef) หากต้องการใช้advdefโดยตรงให้สร้าง file.tar.gz ตามที่คุณต้องการ จากนั้นเรียกใช้:

advdef -z -4 file.tar.gz

สิ่งนี้จะสร้างไฟล์ gz มาตรฐานที่สามารถอ่านได้โดย gzip และ tar ตามปกติซึ่งเล็กกว่านิดหน่อย นี่เป็นเรื่องที่ดีที่สุดที่คุณสามารถทำได้กับรูปแบบ gz

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

 tar cv path/to/data | xz -9 > file.tar.xz

tar รุ่นใหม่เช่นใน Ubuntu 13.10 จะตรวจจับไฟล์ที่ถูกบีบอัดโดยอัตโนมัติ ดังนั้นแม้ว่าคุณจะใช้การบีบอัด xz คุณก็ยังสามารถคลายการบีบอัดได้ตามปกติ:

 tar xvf file.tar.xz

เพื่อให้ทราบภาพคร่าวๆเกี่ยวกับการบีบอัดยูทิลิตี้เหล่านี้ให้พิจารณาผลของการบีบอัด patch-3.1.1 จากเคอร์เนล linux:

utility         cpu    format  size(bytes)
gzip -9         0.02s  gz      105,628
advdef -2       0.07s  gz      102,619
7z -mx=9 -tgzip 0.42s  gz      102,297
advdef -3       0.55s  gz      102,290
advdef -4       0.75s  gz      101,956
xz -9           0.03s  xz       91,064
xz -3e          0.15s  xz       90,996

ในตัวอย่างเล็ก ๆ น้อย ๆ นี้เราจะเห็นว่าเพื่อให้ได้ gz ที่เล็กที่สุดที่เราต้องการ advdef (แม้ว่า 7z-tgzip นั้นเกือบจะดีและมีรถบั๊กน้อยกว่า) เรายังเห็นว่าการเปลี่ยนเป็น xz ทำให้เรามีพื้นที่มากขึ้นกว่าที่จะบีบรูปแบบ gz เก่าที่สุดโดยไม่ต้องบีบอัดใช้เวลานานเกินไป


OP ขอวิธีบีบอัดไฟล์. tar.gz ให้มากที่สุด แต่คุณแนะนำให้สร้างไฟล์. tar.xz คุณกำลังตอบคำถามที่แตกต่างจากที่ถาม
ChrisInEdmonton

อาฉันเห็นสิ่งที่คุณจะทำ advdef เพิ่งล่มในระบบของฉัน (v1.15) ดังนั้น 'advdef -z -4 file.tar.gz' ไม่ทำงาน แต่อย่างน้อยก็ในทางทฤษฎี ฉันไม่สามารถหาหลักฐานว่ามันจะทำให้ไฟล์หดตัวเกินกว่า 'gzip -9' แต่อาจและในกรณีใด ๆ ก็เพียงพอแล้วที่ฉันจะลบ -1 โหวตของฉัน ขอบคุณสำหรับการชี้แจง!
ChrisInEdmonton

อืมฉันใช้ v1.17 อย่างไรก็ตามนักคณิตศาสตร์เชิงอวดในตัวผมก็อยากจะชี้ให้เห็นว่าคำตอบของผมนั้นไม่ถูกต้องทางเทคนิค ท้ายที่สุดถ้าคุณระบุไฟล์ gz ที่เป็นไปได้ทั้งหมดตั้งแต่สั้นที่สุดไปจนถึงยาวที่สุดและเลือกไฟล์แรกที่คลายการบีบอัดเป็นไฟล์ขวาคุณสามารถโกนทิ้งได้อีกสองสามไบต์ แต่นั่นจะช้าเกินไปในทางปฏิบัติ
gmatht

ฉันไม่คิดว่าควรใช้ "บั๊กกี้" และ "ไฟล์เก็บถาวร" ร่วมกันไฟล์เก็บถาวรที่เสียหายคืออะไร คุณจำเป็นต้องมีมากไฟล์ขนาดใหญ่เพื่อ "เปรียบเทียบ" สาธารณูปโภคการบีบอัดและประเภทที่แตกต่างกันของการป้อนข้อมูลไฟล์เกินไป - วัดในร้อยของความแตกต่างที่สองคือไม่น่าเชื่อถือที่ผมคิดว่าxz -9จะใช้เวลาบางอย่างเช่น 5 เท่าgz -9เวลาไม่ได้เป็นเพียง 1.5x เป็น ตารางของคุณแนะนำ
Xen2050

เราจะสร้างการแยกเก็บถาวร (ในขณะที่บีบอัด) โดยใช้กระบวนการ xz ได้อย่างไร
nyxee

6
tar c /path/to/data | gzip --best > file.tar.gz

gzipตัวเลือก--best(เทียบเท่า-9) ขอระดับการบีบอัดสูงสุด


4
หรือใช้--bestค่าสถานะ: -9 ทำให้ผู้อ่านสับสน
om-nom-nom
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.