จะระบุระดับการบีบอัดได้อย่างไรเมื่อใช้ tar -zcvf


142

ฉันไดเรกทอรี gzip บ่อยในที่ทำงาน สิ่งที่ฉันทำตามปกติคือ

tar -zcvf file.tar.gz /path/to/directory

มีวิธีระบุระดับการบีบอัดที่นี่หรือไม่ ฉันต้องการใช้การบีบอัดที่ดีที่สุดเท่าที่จะเป็นไปได้แม้ว่าจะใช้เวลาในการบีบอัดมากกว่าก็ตาม

คำตอบ:


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

สมมติว่าคุณกำลังใช้ bash โดยทั่วไปตั้งค่าตัวแปรสภาพแวดล้อม GZIP เป็น "-9" และเรียกใช้ tar ตามปกติ

ถ้าคุณต้องการการบีบอัดที่ดีที่สุดอย่าใช้ gzip ใช้ lzma หรือ 7z

และเมื่อใช้ gzip (ซึ่งเป็นความคิดที่ดีสำหรับการต่างๆของเหตุผลอยู่แล้ว) พิจารณาการใช้โปรแกรมและไม่pigzgzip


14
pigz คือ "parallel gzip" ซึ่งใช้คอร์ทั้งหมดของคุณสำหรับการบีบอัด gzip คุณสามารถรับชมtopและดูได้โดยใช้ซีพียูระหว่าง 200% -400 $
เฟลิเป้อัลวาเรซ

2
FYI, สำหรับรูปแบบ. bz2 ให้ใช้: BZIP2 = -9 tar cvjf file.tar.bz2 / พา ธ / ไปยัง / ไดเรกทอรี
Tomofumi

3
ตัวแปรสภาพแวดล้อมน่าจะเป็นตอนนี้GZIP_OPTการใช้ควรจะเหมือนกัน
ผู้ทำนาย

3
จาก man page บน Ubuntu 16.04 สำหรับ gzip: "บน Vax / VMS ชื่อของตัวแปรสภาพแวดล้อมคือ GZIP_OPT เพื่อหลีกเลี่ยงความขัดแย้งกับชุดสัญลักษณ์สำหรับการเรียกใช้โปรแกรม" สำหรับ sh, csh และ MSDOS มันควรจะเป็นแค่ GZIP
Ponyboy47

68

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

tar -cvf files.tar /path/to/file0 /path/to/file1 ; gzip -9 files.tar

หรือคุณสามารถใช้:

tar cvf - /path/to/file0 /path/to/file1 | gzip -9 - > files.tar.gz

-9 ในบรรทัดคำสั่ง gzip บอกให้ gzip ใช้ระดับการบีบอัดที่เป็นไปได้สูงสุด (ค่าเริ่มต้นคือ -6)

แก้ไข:แก้ไขบรรทัดคำสั่งไปป์ตามความคิดเห็น @depesz


4
การใช้ท่อควรทำด้วย:tar cvf - /path/to/directory | gzip -9 - > file.tar.gz

1
ตัวอย่างแรกควรลงท้ายด้วยfile.tarเนื่องจากgzipเพิ่มส่วนขยาย ".gz"
bonsaiviking

4
ทำไมคุณไม่ข้ามf -? หากไม่มีไฟล์แสดงว่าเป็นไฟล์ stdin / out
akostadinov

นอกจากความคิดเห็นก่อนหน้า จากส่วน "man tar" Environtment: TAPE อุปกรณ์หรือไฟล์ที่จะใช้สำหรับไฟล์เก็บถาวรหากไม่ได้ระบุ --file หากไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อมนี้ให้ใช้ stdin หรือ stdout แทน
Mikl

2
และเราสามารถลด "gzip -9 -" -> "gzip -9" จากส่วน "man gzip" คำอธิบาย: หากไม่มีการระบุไฟล์หรือหากชื่อไฟล์เป็น "-" อินพุตมาตรฐานจะถูกบีบอัดไปยังเอาต์พุตมาตรฐาน
Mikl

53

รุ่นใหม่ของ tar สนับสนุนรูปแบบการเก็บถาวร xz (tar GNU ตั้งแต่ 1.22ในปี 2009, Busybox ตั้งแต่ 1.17.0ในปี 2010)

ก็ขึ้นอยู่กับlzma2 , ชนิดเช่น7-Zipรุ่นGZ สิ่งนี้จะช่วยให้การบีบอัดที่ดีขึ้นถ้าคุณโอเคกับความต้องการของการสนับสนุน xz

tar -Jcvf file.tar.xz /path/to/directory

ฉันเพิ่งพบที่นี่ (โดยทั่วไปแล้วเป็นคำถามของคำถามนี้ แต่ใน Unix stackexchange) ว่ายังมีตัวแปรสภาพแวดล้อม XZ_OPT = -9 เพื่อควบคุมระดับการบีบอัด XZ คล้ายกับ GZIP หนึ่งในโพสต์อื่น

XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory

2
+1 xz ดีกว่าทั้ง bzip2 และ gzip นี่คือการเปรียบเทียบ: tukaani.org/lzma/benchmarks.html
User1

8
การแลกเปลี่ยนคือความเร็ว XZ ช้าลงอย่างมาก
เบลล์

32
tar cv /path/to/directory | gzip --best > file.tar.gz

นี่เป็นวิธีแก้ปัญหาที่สองของ Matrix Mole แต่สั้นลงเล็กน้อย

เมื่อเรียก tar ตัวเลือกfระบุว่าผลลัพธ์เป็นไฟล์ การตั้งค่าให้-(stdout) ทำให้ tar เขียนออกไปยัง stdout ซึ่งเป็นพฤติกรรมเริ่มต้นโดยไม่ต้องทั้งสองและf-

และตามที่ระบุไว้ในgzipman page หากไม่มีไฟล์ที่ระบุ gzip จะบีบอัดจากอินพุตมาตรฐาน ไม่จำเป็นต้องมี-ในการgzipโทร

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


1
มันใช้งานได้อย่างสวยงาม นอกจากนี้หากคุณเรียกใช้ในฐานะรูทสิทธิ์และเจ้าของจะถูกสงวนไว้เช่นกัน มิฉะนั้นคุณจะต้องระบุ นอกจากนี้หากไม่ชัดเจนว่า "-9" คือการบีบอัดที่ดีที่สุดและ "-1" เป็นการบีบอัดที่เร็วที่สุด "-1" ยังคงใช้เวลา looong ถ้าคุณมีไฟล์มากมาย ;-)
PJ Brunet

สิ่งนี้ใช้ได้กับxzและpixzด้วย เป็นวิธีที่ดีในการควบคุมจำนวนเธรดที่ใช้สำหรับการบีบอัดแบบขนานโดยไม่ต้องสร้างไฟล์. tar ระดับกลาง ชอบมากtar -cv /path/to/dir | pixz -p4 > output.tpxz
joelostblom

10

นอกจากนี้ยังมีตัวเลือกในการระบุโปรแกรมบีบอัดโดยใช้ -I ซึ่งอาจรวมถึงตัวเลือกระดับการบีบอัด

tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory

2
tar รุ่นเก่ากว่าเช่นที่มีให้ใน CentOS 6 & 7 ไม่สนับสนุนการมีข้อโต้แย้งใน-Iหาเรื่องพวกเขาจะพยายามรักษาทุกสิ่งในฐานะชื่อโปรแกรมที่จะดำเนินการและล้มเหลว อย่างน้อยที่สุดเท่ากับ tar 1.29 ใน Debian Stretch สิ่งนี้ใช้ได้
Cheetah

2

และแน่นอนว่า tar ที่ได้มาจาก macOS bsd นั้นต้องแตกต่างกัน:

tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.