แยกไฟล์เดี่ยวจากไฟล์ tgz ขนาดใหญ่


19

ฉันมีไฟล์ tar ขนาดใหญ่ (ประมาณ 500G) และฉันไม่ต้องการแยกไฟล์เพียงไฟล์เดียว
อย่างไรก็ตามเมื่อฉันเรียกใช้tar -xvf file.tgz path/to/fileดูเหมือนว่าจะยังคงโหลดเนื้อหาทั้งหมดลงในหน่วยความจำและใช้เวลามากกว่าหนึ่งชั่วโมงในการแยก ฉันได้ลองใช้--exclude=ignore.txtเมื่อไม่ใช้ไฟล์.txtซึ่งเป็นรายการรูปแบบในความพยายามที่จะห้ามไม่ให้ข้ามเส้นทางที่ไร้ประโยชน์ แต่ดูเหมือนจะไม่ทำงาน

บางทีฉันไม่เข้าใจ tar ... มีวิธีแยกไฟล์อย่างรวดเร็วหรือไม่?


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

คำตอบ:


14

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

นี่คือที่เก็บถาวร.zipรูปแบบ (และรูปแบบอื่น ๆ.rar) ทำงานได้ดีกว่ามากเนื่องจากzipรูปแบบมีไดเรกทอรีกลางของไฟล์ทั้งหมดที่อยู่ในนั้นโดยมีออฟเซ็ตตรงชี้ไปที่ตรงกลางของzipไฟล์เพื่อให้สามารถแยกสมาชิกเก็บถาวรได้อย่างรวดเร็ว

คุณอาจถามว่าทำไมการประมวลผลถึง.tar.gzช้าเหลือเกิน

.tar.gz(มักย่อให้สั้นลง.tgz) เป็น.tarไฟล์บีบอัดที่เก็บถาวรด้วยgzipคอมเพรสเซอร์ gzipเป็นสตรีมมิ่งคอมเพรสเซอร์ที่สามารถทำงานกับไฟล์เดียวเท่านั้น หากคุณต้องการที่จะได้รับส่วนหนึ่งของgzipกระแสคุณต้องยกเลิกการบีบอัดเป็นทั้งหมดและนี่คือสิ่งที่มันฆ่ามัน.tar.gz(และสำหรับ.tar.bz2, .tar.xzและรูปแบบอื่นที่คล้ายคลึงกันบนพื้นฐาน.tar)

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

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


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

9

หากคุณกำลังสกัดเพียงหนึ่งไฟล์จากไฟล์ tar ขนาดใหญ่ที่คุณกำลังใช้ GNU tar, และคุณสามารถรับประกันได้ว่าไฟล์ tar ไม่เคยได้รับการผนวกเข้ากับ--occurrenceแล้วคุณสามารถได้รับการเพิ่มประสิทธิภาพการทำงานอย่างมีนัยสำคัญโดยใช้

ตัวเลือกนี้จะบอก tar ให้หยุดทันทีที่พบการเกิดขึ้นครั้งแรกของแต่ละไฟล์ที่คุณร้องขอเช่น

tar xf large-backup.tar --occurrence etc/passwd etc/shadow

จะไม่เก็บพักใน tarball ทั้งหมดหลังจากที่พบสำเนาหนึ่งชุดของแต่ละชุดpasswdและshadowจะหยุด หากไฟล์เหล่านั้นปรากฏขึ้นใกล้ถึงจุดสิ้นสุดประสิทธิภาพที่เพิ่มขึ้นจะไม่มากนัก แต่หากไฟล์เหล่านั้นปรากฏเป็นครึ่งทางผ่านไฟล์ 500G คุณจะประหยัดเวลาได้มาก

สำหรับผู้ที่ใช้tarสำหรับการสำรองข้อมูล shot เดียวและไม่ได้ใช้เทปไดรฟ์จริงสถานการณ์นี้อาจเป็นกรณีทั่วไป

โปรดทราบว่าคุณยังสามารถผ่าน--occurrence=NUMBERการดึงการเกิด NUMBERth ของแต่ละไฟล์ซึ่งจะช่วยถ้าคุณรู้ว่ามีอยู่หลายรุ่นในการเก็บ โดยค่าเริ่มต้นพฤติกรรมจะเท่ากับNUMBER1


มีวิธีในการสร้างน้ำมันดินเพื่อให้ไฟล์เฉพาะออกมาก่อนหรือไม่ เพื่อที่--occurrenceจะเตะทันทีในไฟล์แรก? ฉันเดาว่ามันเกี่ยวกับชื่อไฟล์ดังนั้นสิ่งที่เรียกว่า aaaaa.jpg จะออกมาเป็นอันดับแรกเช่นกัน?
Jeff

1
@Jeff: ไม่จริง นี่เป็นเพียงการป้องกันไม่tarให้ค้นหา tarball เพื่อหาไฟล์เวอร์ชันที่ใหม่กว่าที่พบ แทนที่จะกลับมาดังที่หน้าคนบอกว่าthe Nth occurrence. หากคุณระบุหนึ่งไฟล์ที่จะแยกในบรรทัดคำสั่งและคุณพูด--occurrenceแล้ว tar จะออกจากทันทีที่พบไฟล์นั้นและหยุดอย่างมีประสิทธิภาพที่ "ไฟล์แรก"
phogg

2

เมื่อต้องรับมือกับ tarball ขนาดใหญ่ให้ใช้:

--fast-readเพื่อแยกเฉพาะรายการเก็บถาวรแรกที่ตรงกับตัวถูกดำเนินการชื่อไฟล์path/to/fileในกรณีนี้ - ซึ่งจะไม่ซ้ำกันใน tarball ต่อไป

tar -xvf file.tgz --fast-read path/to/file

ด้านบนจะค้นหาจนกว่าจะพบการแข่งขันและจากนั้นออก


1
ฉันต้องการที่จะเข้าใจว่าทำไมถึงยัง 0 คะแนน man tar(GNU tar 1.29) ไม่แม้แต่พิมพ์ตัวเลือกนี้ อย่างไรก็ตามอูบุนตูดูเหมือนว่าจะมีมันเปิดใช้โดยปริยาย อ่านหนังสือได้อย่างรวดเร็วผมไม่แน่ใจว่าสิ่งที่ไม่แตกต่างจาก--fast-read --occurrenceแต่--occurrenceไม่ใช่ในหน้า Ubuntu แต่อยู่ในman tarนั้น มี--fast-readและ--occurrenceสิ่งเดียวกันอาจเป็นไปได้หรือไม่
Jeff

ตัวเลือกเหล่านี้ไม่มีการระบุโดยมาตรฐานและเช่นเดียวกับตัวเลือกที่ไม่ได้มาตรฐานจะต้องใช้ความระมัดระวังเพื่อให้แน่ใจว่ายูทิลิตี้ในระบบของคุณรองรับพวกเขา ตัวเลือก --occurrences รองรับโดย GNU tar ตัวเลือก - อ่านอย่างรวดเร็วได้รับการสนับสนุนโดยรุ่นล่าสุดของ FreeBSD tar ซึ่งบรรจุเป็น bsdtar โดย Ubuntu ดูที่นี่สำหรับข้อมูลเพิ่มเติม
phogg

1

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

ดังนั้นคุณอาจจะต้องรอ

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