ฉันจะรวมไฟล์บีบอัดหลายไฟล์ไว้ในที่เก็บถาวรได้อย่างไร


10

ฉันมี.tar.xzไฟล์สองสามร้อยไฟล์ซึ่งเกือบจะเหมือนกัน (เป็นไฟล์ทิ้งทุกวันและฐานข้อมูลเปลี่ยนแปลงช้า)

ฉันเชื่อว่าเนื่องจากความคล้ายคลึงกันในไฟล์ที่ไม่มีการบีบอัดไฟล์เหล่านั้นจะบีบอัดได้ดีมากและการทดสอบขนาดเล็กได้แสดงให้เห็นว่าการบีบอัดไฟล์ที่ไม่มีการบีบอัดจำนวนเท่าใดก็ได้สร้างไฟล์เก็บถาวรที่มีขนาดใหญ่กว่าหนึ่งไฟล์

ปัญหาของฉันคือไฟล์ที่ไม่มีการบีบอัดทั้งหมดจะมีขนาดเทราไบต์ไม่กี่ตัว (อัตราส่วนการบีบอัดประมาณ 25: 1) และฉันไม่มีพื้นที่ดิสก์มากพอที่จะใช้เป็นพื้นที่ทำงาน

มีวิธีที่ฉันสามารถประมวลผลไฟล์บีบอัดทีละไฟล์เพิ่มไฟล์ลงในไฟล์เก็บถาวรไฟล์เดียวและยังคงรักษาประโยชน์ของการบีบอัดไฟล์ไว้ด้วยกันได้หรือไม่?


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

คำตอบ:


10

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

xzcat *.tar.xz | xz -c > combined.tar.xz

combined.tar.xzจะเป็น tarball บีบอัดของไฟล์ทั้งหมดใน tarballs องค์ประกอบที่เสียหายเพียงเล็กน้อยเท่านั้น ในการแยกคุณจะต้องใช้--ignore-zerosตัวเลือก (ใน GNU tar) เนื่องจากไฟล์เก็บถาวรมีเครื่องหมาย "สิ้นสุดไฟล์" ที่จะปรากฏขึ้นตรงกลางของผลลัพธ์ นอกเหนือจากนั้นทุกอย่างจะทำงานได้อย่างถูกต้อง

GNU tarยังรองรับ--concatenateโหมดสำหรับการสร้างคลังเก็บรวม ที่มีข้อ จำกัด เช่นเดียวกับข้างต้น - คุณต้องใช้--ignore-zerosเพื่อแยก - แต่มันไม่ทำงานกับคลังเก็บบีบอัด คุณสามารถสร้างบางสิ่งบางอย่างขึ้นมาเพื่อหลอกให้มันทำงานโดยใช้การทดแทนกระบวนการ แต่มันยุ่งยากและเปราะบางยิ่งขึ้น

หากมีไฟล์ที่ปรากฏมากกว่าหนึ่งครั้งในไฟล์ tar ที่แตกต่างกันสิ่งนี้จะไม่ทำงานอย่างถูกต้อง แต่คุณประสบปัญหานั้นโดยไม่คำนึงถึง มิฉะนั้นสิ่งนี้จะให้สิ่งที่คุณต้องการ - การส่งออกท่อผ่านxzเป็นวิธีการtarบีบอัดเอาท์พุทของมันต่อไป


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

tar cJf combined.tar.xz dummy-file
for x in db-*.tar.xz
do
    mkdir tmp
    pushd tmp
    tar xJf "../$x"
    tar rJf ../combined.tar.xz .
    popd
    rm -r tmp
done

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

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

tar cJf combined.tar.xz dummy-file
for x in db-*.tar.xz
do
    xz -dk "$x"
    tar rJf combined.tar.xz "${x%.xz}"
    rm -f "${x%.xz}"
done

สิ่งนี้มีประสิทธิภาพน้อยกว่าเล็กน้อยในแง่ของขนาดที่บีบอัดสุดท้ายเนื่องจากมีส่วนหัว tar เพิ่มเติมในสตรีม แต่ประหยัดเวลาในการแตกไฟล์และเพิ่มไฟล์ทั้งหมดเป็นไฟล์อีกครั้ง คุณจะพบว่าcombined.tar.xzมีdb-*.tarไฟล์จำนวนมาก (ไม่บีบอัด)


ขอบคุณตัวเลือกที่สองของคุณดูเหมาะสมกับวัตถุประสงค์ของฉัน แต่คุณสามารถอธิบายรายละเอียดในย่อหน้าสุดท้ายของคุณได้หรือไม่? สิ่งนี้จะมีลักษณะอย่างไร
jl6

@ jl6: ดูการแก้ไข
Michael Homer

ขออภัยมีเพียงสามารถทดสอบได้เท่านั้น วิธีที่สองของคุณทำให้ฉันเกิดข้อผิดพลาดนี้:tar: Cannot update compressed archives
jl6
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.