ลบไฟล์ออกจากไฟล์เก็บถาวร tar


17

ฉันมีไฟล์ขนาดใหญ่foo.tar.xzที่มีจำนวนมาก (พูดถึง 20,000 ไฟล์) ฉันพบว่าไฟล์เก็บถาวรนี้มีไฟล์ (ประมาณ 5,000 ไฟล์) ที่ฉันไม่ต้องการ ฉันมีพื้นที่ว่างในดิสก์ไม่เพียงพอในการขยายขนาดทั้งหมดลงบนดิสก์ นอกจากนี้ฉันกลัวว่าคุณลักษณะ / สิทธิ์อาจหายไปหากทำเช่นนั้น ฉันมีพื้นที่เพียงพอที่จะโฮสต์ไฟล์เก็บถาวรที่บีบอัดสองชุด มีเครื่องมือในการลบไฟล์บางไฟล์ออกจากไฟล์เก็บถาวร (ระบุด้วย regex ในชื่อไฟล์) on-the-fly หรือไม่โดยไม่ทำการแตกไฟล์ลงในไฟล์แต่ละไฟล์หรือไม่?

คำตอบ:


15

tar GNU มี--deleteตัวเลือกที่ใช้งานได้กับคลังเก็บในทุกวันนี้

ใช้แบบนี้เช่น:

tar -vf yourArchive.tar --delete your/path/to/delete

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

นอกจากนี้การดำเนินการจะค่อนข้างช้าในทุกกรณีเนื่องจากลักษณะเชิงเส้น (โดยการออกแบบ) ที่บรรจุของ tar เก็บถาวร


1
มันมีอยู่ แต่มันไม่ทำงานกับไฟล์ที่ไม่สามารถเข้าถึงแบบสุ่ม (เช่นบีบอัดไฟล์เก็บถาวร) แต่นี่เป็นกรณีใช้งานของฉัน
FUZxxl

1
ปัญหาอื่นคือฉันไม่สามารถระบุรูปแบบที่จะลบ หมายเหตุความคิดเห็นของฉันจากปี 2013 ที่ฉันได้แก้ไขข้อบกพร่องgtar --deleteแล้ว
FUZxxl

4
@FUZxxl -Tทำงานร่วมกับ--deleteและช่วยให้คุณใช้รูปแบบมากกว่าชื่อไฟล์เพื่อสร้างไฟล์ชั่วคราวที่มีรูปแบบและการใช้งาน--wildcards unxz < file.tar.xz | tar --wildcards --delete -T patternfile | xz > file2.tar.xzมันจะไม่ทำ regex แบบเต็ม (ถ้าคุณต้องการเพียงแค่ใช้tar -tและสร้างรายการชื่อไฟล์ที่จะลบ) เพียงแค่ชื่อรูปแบบการจับคู่
สุ่ม 832

14

(แก้ไขเมื่อฉันเข้าใจผิดคำถามซึ่งแก้ไขตั้งแต่ด้วย)

วิธีที่ดีที่สุดที่คุณสามารถทำได้คือการแยกลบและบีบอัดไฟล์ทั้งหมดใหม่อีกครั้ง

unxz < foobar-old.tar.xz | tar --delete foo/bar | xz > foobar-new.tar.xz

ไม่สามารถลบไฟล์จาก tar ได้โดยตรง

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

หากคุณต้องการฟังก์ชั่นนี้ tar อาจไม่ใช่สิ่งที่คุณต้องการ


ไฟล์เหล่านั้นคิดเป็น 35% ของขนาดไฟล์เก็บถาวร ข้อ จำกัด ที่คุณชี้ให้เห็นนั้นจะใช้เฉพาะเมื่อฉันเขียนไฟล์ใหม่ไม่ใช่ถ้าฉันแก้ไขนอกสถานที่ซึ่งฉันสามารถทำได้ (ฉันมีพื้นที่เพียงพอที่จะบันทึกไฟล์เก็บถาวรที่บรรจุไว้สองครั้ง) มีเครื่องมือดังกล่าวหรือไม่?
FUZxxl

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

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

1
นั่นไม่ใช่ปัญหาเลย หากฉันสามารถทำสิ่งนี้ได้ในครั้งเดียวเวลาจะไม่นานเกินไป ฉันไม่สามารถจินตนาการรูปแบบไฟล์เก็บถาวรใด ๆ ที่อนุญาตให้ทำการลบอย่างรวดเร็วในขณะที่ปล่อยหน่วยความจำออกจริง
FUZxxl

1
--wildcardsช่วยด้วย ... ฉันต้องรวม./ตอนเริ่มต้นของรูปแบบแม้ว่า ...
Gert van den Berg

-4

ตามคู่มือคุณสามารถส่งรายชื่อไฟล์ไปtarยังเพื่อแยกไฟล์เหล่านั้นเท่านั้น ตัวอย่างเช่น:

$ tar --file archive.tar --list
foo
bar
baz

$ tar --file archive.tar --extract foo

ฉันไม่เห็นว่า --extract ช่วยฉันได้อย่างไร คุณสามารถทำอย่างละเอียด? โปรดจำไว้ว่าฉันไม่สามารถแยกไฟล์เก็บถาวร (หรือบางส่วนที่สำคัญ) ลงในดิสก์ได้
FUZxxl

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