การเชื่อมต่ออย่างรวดเร็วของไฟล์ GZip หลายไฟล์


93

ฉันมีรายการไฟล์ gzip:

file1.gz
file2.gz
file3.gz

มีวิธีการเชื่อมต่อหรือ gzipping ไฟล์เหล่านี้เป็นไฟล์ gzip เดียว โดยไม่ต้องคลายการบีบอัดหรือไม่?

ในทางปฏิบัติเราจะใช้สิ่งนี้ในฐานข้อมูลบนเว็บ (CGI) โดยที่เว็บจะรับแบบสอบถามจากผู้ใช้และแสดงรายการไฟล์ทั้งหมดตามแบบสอบถามและนำเสนอในไฟล์แบตช์กลับไปยังผู้ใช้

คำตอบ:


107

ด้วยไฟล์ gzip คุณสามารถเชื่อมไฟล์เข้าด้วยกันได้ดังนี้:

cat file1.gz file2.gz file3.gz > allfiles.gz

ต่อRFC gzip ,

ไฟล์ gzip ประกอบด้วยชุดของ "สมาชิก" (ชุดข้อมูลบีบอัด) [... ] สมาชิกจะปรากฏทีละคนในไฟล์โดยไม่มีข้อมูลเพิ่มเติมก่อนระหว่างหรือหลังพวกเขา

โปรดทราบว่าสิ่งนี้ไม่เหมือนกับการสร้างไฟล์ gzip ไฟล์เดียวของข้อมูลที่ต่อกัน เหนือสิ่งอื่นใดชื่อไฟล์ดั้งเดิมทั้งหมดจะถูกเก็บรักษาไว้ อย่างไรก็ตามดูเหมือนว่า gunzip จะจัดการกับมันได้เทียบเท่ากับการเรียงต่อกัน

เนื่องจากเครื่องมือที่มีอยู่โดยทั่วไปจะไม่สนใจส่วนหัวของชื่อไฟล์สำหรับสมาชิกเพิ่มเติมจึงไม่สามารถแยกไฟล์แต่ละไฟล์ออกจากผลลัพธ์ได้อย่างง่ายดาย หากคุณต้องการให้เป็นไปได้ให้สร้างไฟล์ ZIP แทน ZIP และ GZIP ใช้อัลกอริทึม DEFLATE สำหรับการบีบอัดจริง (ZIP รองรับอัลกอริธึมการบีบอัดอื่น ๆ รวมถึงตัวเลือก - วิธีที่ 8 เป็นวิธีที่สอดคล้องกับการบีบอัดของ GZIP) ความแตกต่างอยู่ในรูปแบบข้อมูลเมตา เนื่องจากข้อมูลเมตาไม่มีการบีบอัดจึงทำได้ง่ายพอที่จะตัดส่วนหัว gzip ออกและยึดส่วนหัวของไฟล์ ZIP และบันทึกไดเรกทอรีกลาง อ้างถึงกำหนดรูปแบบ gzipและกำหนดรูปแบบไปรษณีย์


41
ไม่ เพียงcat file1.gz file2.gz file3.gz > allfiles.gz. มันง่ายจริงๆ :)
bdonlan

1
ในทางเทคนิคพวกเขาจะถูกเก็บรักษาไว้ เป็นเพียงเครื่องมือที่มีอยู่โดยทั่วไปไม่มีความสามารถในการแยกออกจากกัน คุณอาจต้องการตรวจสอบการสร้างส่วนหัว ZIP และไดเร็กทอรี - รูปแบบ ZIP ใช้อัลกอริธึมการบีบอัดที่เหมือนกันดังนั้นจึงเป็นเพียงเรื่องของการเปลี่ยนข้อมูลเมตา (ไม่บีบอัด) ลองดูที่gzip.org/zlib/rfc-gzip.html (รูปแบบที่มา) และpkware.com/documents/casestudies/APPNOTE.TXT
bdonlan

20
ดีกว่าการสร้างไฟล์ zip ของ gz เพียงแค่ tar ไฟล์ เช่นเดียวกับcatคำตอบ แต่มีข้อมูลเมตาเพิ่มเติม คุณสามารถแก้ปัญหาได้ในภายหลังเพื่อรับชื่อไฟล์ต้นฉบับจากนั้นคลายไฟล์ทั้งหมดหรือเพียงบางส่วนตามต้องการ
sorpigal

2
@alvas zcatคลายการบีบอัดอินพุตดังนั้นจะให้เอาต์พุตที่คลายการบีบอัดพร้อม.gzส่วนขยาย
bdonlan

2
เห็นได้ชัดว่ามีเครื่องมือบางอย่างที่จะหยุดทำงานโดยไม่ตั้งใจเมื่อถึงจุดสิ้นสุดของสมาชิก gzip'ed แรก github.com/pysam-developers/pysam/issues/…
Jeremy Leipzig

51

นี่คือสิ่งที่man 1 gzipบอกเกี่ยวกับความต้องการของคุณ

ไฟล์บีบอัดหลายไฟล์สามารถต่อกันได้ ในกรณีนี้ gunzip จะแยกสมาชิกทั้งหมดในครั้งเดียว ตัวอย่างเช่น:

gzip -c file1  > foo.gz
gzip -c file2 >> foo.gz

แล้ว

gunzip -c foo

เทียบเท่ากับ

cat file1 file2

ไม่จำเป็นต้องพูดfile1สามารถแทนที่file1.gzได้

คุณต้องสังเกตสิ่งนี้:

gunzip จะแยกสมาชิกทั้งหมดในครั้งเดียว

ดังนั้นในการรับสมาชิกทั้งหมดทีละคนคุณจะต้องใช้อะไรเพิ่มเติมหรือเขียนหากต้องการ

อย่างไรก็ตามยังมีการระบุไว้ใน man page ด้วย

หากคุณต้องการสร้างไฟล์เก็บถาวรเดียวที่มีสมาชิกหลายคนเพื่อให้สามารถแยกสมาชิกได้ในภายหลังให้ใช้ไฟล์เก็บถาวรเช่น tar หรือ zip GNU tar รองรับ-zตัวเลือกในการเรียกใช้ gzip อย่างโปร่งใส gzip ได้รับการออกแบบมาเพื่อเติมเต็มน้ำมันดินไม่ใช่เพื่อทดแทน


13

เพียงแค่ใช้ cat. เร็วมาก (0.2 วินาทีสำหรับ 500 MB สำหรับฉัน)

cat *gz > final
mv final final.gz

จากนั้นคุณสามารถอ่านผลลัพธ์ด้วย zcat เพื่อให้แน่ใจว่ามันสวย:

zcat final.gz

ฉันลองใช้คำตอบอื่นของ 'gz -c' แต่ฉันเจอขยะเมื่อใช้ไฟล์ gzipped เป็นอินพุตแล้ว (ฉันเดาว่ามันบีบอัดสองครั้ง)

PV:

ยังดีกว่าถ้าคุณมี 'pv' แทน cat:

pv *gz > final
mv final final.gz

สิ่งนี้ให้แถบความคืบหน้าตามที่ใช้งานได้ แต่ทำเช่นเดียวกับ cat


11

คุณสามารถสร้างไฟล์ tar ของไฟล์เหล่านี้จากนั้น gzip ไฟล์ tar เพื่อสร้างไฟล์ gzip ใหม่

tar -cvf newcombined.tar file1.gz file2.gz file3.gz
gzip newcombined.tar

8
ทำไมคุณควร gzip ไฟล์ tar ใหม่? มันถูกบีบอัดแล้ว (นอกเหนือจากข้อมูลเมตาของ tar ซึ่งควรมีขนาดเล็ก)
thiton

2
คุณพูดถูก ขนาดไฟล์จะไม่มีความแตกต่างกันมากนักไม่ว่าคุณจะ gzip เพราะไฟล์แต่ละไฟล์ถูก gzip แล้ว เป็นเพียงเพราะเขาต้องการให้ไฟล์ gzip ออกจากไฟล์ทั้งสามไฟล์
Drona

1
gzip พิเศษทำให้การเข้าถึงเนื้อหาช้าลงโดยไม่ได้รับผลประโยชน์ใด ๆ สำหรับฉันแล้วดูเหมือนว่าข้อกำหนดของ OPs นั้นจริงๆแล้วไฟล์เก็บถาวรผลลัพธ์จะเป็นไฟล์เดียวและไม่มีเหตุผลที่จะคิดว่าไฟล์ผลลัพธ์ควรเป็นไฟล์ gzip
mc0e
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.