วิธีแยกไฟล์เฉพาะจาก tar.gz


105

เราจะแยกไฟล์เฉพาะจากไฟล์ tar.gz ขนาดใหญ่ได้อย่างไร ฉันพบกระบวนการแตกไฟล์จาก tar ในคำถามนี้แต่เมื่อฉันลองคำสั่งที่กล่าวถึงที่นั่นฉันได้รับข้อผิดพลาด:

$ tar --extract --file={test.tar.gz} {extract11}
tar: {test.tar.gz}: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now

ฉันจะแตกไฟล์ได้tar.gzอย่างไร


โปรดทราบว่าโซลูชันใด ๆ จะต้องขยายไฟล์เก็บถาวรทั้งหมดก่อน: superuser.com/questions/655739/…หากคุณต้องการหลีกเลี่ยงปัญหานี้คุณจะต้องใช้รูปแบบอื่นเช่น zip ZIP จะให้การบีบอัดที่น้อยลงเนื่องจากมันบีบอัดไฟล์แยกต่างหาก: superuser.com/questions/1013309/…ฉันสงสัยว่ามีรูปแบบที่รองรับทั้งความเร็วและความสามารถในการแยกไฟล์เดียวหรือไม่
Ciro Santilli 新疆改造中心法轮功六四事件

คำตอบ:


119

คุณยังสามารถใช้ tar -zxvf <tar filename> <file you want to extract>

คุณต้องเขียนชื่อไฟล์ที่แน่นอนตามที่tar ztf test.tar.gzแสดง หากมีการระบุเช่น./extract11หรือsome/bunch/of/dirs/extract11นั่นคือสิ่งที่คุณต้องให้ (และไฟล์จะแสดงภายใต้ชื่อนั้น ๆ ไดเรกทอรีที่ต้องการจะถูกสร้างขึ้นโดยอัตโนมัติ)

  • -x: สั่งให้ tar เพื่อแตกไฟล์
  • -f: ระบุชื่อไฟล์ / ชื่อ tarball
  • -v: Verbose (แสดงความคืบหน้าขณะแตกไฟล์)
  • -z: ตัวกรองที่เก็บถาวรผ่าน gzip ใช้เพื่อขยายไฟล์. gz

$ tar -zxvf test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha

1
จากนั้นลองใช้tar tf archive.tar.gz | grep extract11. โปรดตรวจสอบว่า extract11 อยู่ในไฟล์เก็บถาวรหรือไม่
harish.venkat

8
คุณต้องเขียนชื่อไฟล์ที่แน่นอนตามที่tar ztf test.tar.gzแสดง หากมีการระบุเช่น./extract11หรือsome/bunch/of/dirs/extract11นั่นคือสิ่งที่คุณต้องให้ (และไฟล์จะแสดงภายใต้ชื่อนั้น ๆ ไดเรกทอรีที่ต้องการจะถูกสร้างขึ้นโดยอัตโนมัติ)
vonbrand

ฉันต้องการเพิ่มจุดที่นี่-zตัวเลือกไม่ทำงานใน unix บางรุ่นเช่น HP-UX
Ankit Vashistha

1
@ pj-brunet: ไม่fต้องไม่สิ้นสุด แต่จะต้องตามด้วยชื่อไฟล์โดยตรง ตัวอย่างนี้กับทุกตัวเลือกอื่น ๆ tar -f mytar.tar.gz -zxv dir/somefileหลังชื่อน้ำมันดินปรับการทำงาน: มันแยก "dir / somefile" จาก "mytar.tar.gz"
mivk

34

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

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

ตัวเลือกที่ 1

$ tar -tzf lotsofdata.tar.gz | grep contract

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

$ tar -xzf lotsofdata.tar.gz <full path and filename from your list above>

คุณอาจต้องเดินไป./ข้างหน้าเพื่อให้มันใช้งานได้

ตัวเลือก 2

$ tar -xzf lotsofdata.tar.gz --wildcards --no-anchored '*contract*'

ขึ้นอยู่กับคุณที่คุณพบว่าง่ายขึ้นหรือมีประโยชน์


DRAT พิมพ์ผิดในคำสั่งสุดท้ายที่: ฉันซ้ำ -xzf ควรมีเพียงหนึ่งอินสแตนซ์ของสวิตช์เหล่านั้น
Crick เวนดี้

tar -xzf lotsofdata.tar.gz <full path and filename from your list above>ทำงานให้ฉันโดยที่เราไม่ได้ให้./ที่จุดเริ่มต้นของเส้นทาง
user13107

คุณอาจต้องอดทนกับสิ่งเหล่านี้ใช้เวลาสักครู่ ... อาจจะชัดเจน แต่มันจะแยกโครงสร้างไดเรกทอรีแบบเต็มในไดเรกทอรีปัจจุบันแม้ว่าไดเรกทอรีเหล่านั้นจะยังไม่มีอยู่
PJ Brunet

BSD tar (อย่างน้อยใน macOS) ไม่รองรับ--wildcardsตัวเลือก -x -O *fooผมสามารถที่จะยังคงได้รับพฤติกรรมที่คล้ายกันด้วย *fooเป็นชื่อไฟล์ glob ในกรณีของฉันเนื่องจากฉันรู้ว่าไฟล์ลงท้ายด้วย foo
Eric Hu

6

ฉันพยายามที่จะดึงไฟล์สองสามร้อยไฟล์จาก tarball ที่มีหลายพันไฟล์ในวันอื่น ๆ ไฟล์ที่ฉันต้องการไม่สามารถอ้างอิงได้ด้วย wildcard ตัวเดียว ดังนั้นฉันจึงไปและพบหน้านี้

อย่างไรก็ตามเทคนิคต่าง ๆ ข้างต้นดูเหมือนจะไม่ดีสำหรับงานของฉัน ฉันสิ้นสุดการอ่านชายและพบตัวเลือกนี้--files-fromดังนั้นทางออกสุดท้ายของฉันคือ

gunzip < thousands.tar.gz | tar -x -v --files-from hundreds.list -f -

และมันใช้งานได้อย่างมีเสน่ห์

อัปเดต:ไฟล์รายการควรมีรูปแบบเดียวกับที่คุณเห็นtar -tvfมิฉะนั้นคุณจะไม่สามารถแตกไฟล์ใด ๆ


2

ตัวอย่างของคุณใช้ได้กับฉันหากคุณไม่ใส่เครื่องมือจัดฟัน

$ tar --extract --file=test.tar.gz extract11

หากไฟล์ของคุณแตก 11 อยู่ในโฟลเดอร์ย่อยคุณควรระบุพา ธ ภายใน tarball

$ tar --extract --file=test.tar.gz subfolder/extract11

$ tar --extract --file=test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha

แยก 11 อย่างจริงจังแล้วไม่ได้อยู่ในไฟล์ tar ตรวจสอบให้แน่ใจว่าคุณต้องระบุเส้นทางสัมพัทธ์ ดูการแก้ไข
Bernhard

1

โปรดดูตัวอย่างด้านล่างของการแยกไฟล์เฉพาะจากไฟล์ tar.gz

จากไฟล์ในเครื่อง:

$ tar xvf file.tgz path/README.txt 2nd_file.txt

จาก URL ระยะไกล:

$ curl -s http://example.com/file.tgz | tar xvf - path/README.txt 2nd_file.txt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.