แตกไฟล์. tar.gz หลายไฟล์ด้วยการเรียก tar เดียว


35

ฉันสงสัยว่า (และแน่นอนอย่างไร) เป็นไปได้ที่จะบอกtarให้แตกไฟล์หลายไฟล์ในการทำงานครั้งเดียว

ฉันเป็นผู้ใช้ Unix ที่มีประสบการณ์มาหลายปีและแน่นอนฉันรู้ว่าคุณสามารถใช้forหรือfindสิ่งต่าง ๆ เช่นนั้นเรียกtarครั้งเดียวสำหรับแต่ละไฟล์เก็บถาวรที่คุณต้องการแยก แต่ฉันไม่สามารถหาบรรทัดคำสั่งที่ใช้งานได้ซึ่งทำให้ฉันtarเพื่อแยกไฟล์. tar.gz สองไฟล์พร้อมกัน (และไม่ไม่มีอะไรผิดปกติกับforฉันแค่ถามว่าเป็นไปได้ที่จะทำโดยไม่)

ฉันถามคำถามนี้ค่อนข้างอยากรู้อยากเห็นบางที

  • มีทางแยกแปลก ๆtarที่สนับสนุนสิ่งนี้
  • บางคนรู้วิธีใช้-Mพารามิเตอร์ที่tarแนะนำให้ฉันเมื่อฉันพยายามtar -zxv -f a.tgz -f b.tgz
  • เราทุกคนตาบอดและเป็นเรื่องง่ายมากที่จะทำ - แต่ฉันไม่พบคำใบ้ใด ๆ ในเว็บที่ไม่ได้ใช้forหรือfindไม่xargsชอบ

โปรดอย่าตอบกลับด้วยtar -zxvf *.tar.gz(เพราะนั่นไม่ได้ผล) และตอบกลับด้วย“ ไม่ทำงาน” เท่านั้นหากคุณแน่ใจอย่างแน่นอน (และอาจมีคำอธิบายที่ดีว่าทำไมเช่นกัน)

แก้ไข:ฉันถูกชี้ไปที่คำตอบสำหรับคำถามนี้ใน Stack Overflowซึ่งระบุในรายละเอียดอย่างมากว่าเป็นไปไม่ได้หากไม่มีการทำลายtarไวยากรณ์ปัจจุบันแต่ฉันไม่คิดว่ามันจะเป็นเรื่องจริง การใช้tar -zxv -f a.tgz -f b.tgzหรือtar -zxv --all-args-are-archives *.tar.gzไม่แบ่งไวยากรณ์ที่มีอยู่ imho


จากสถานการณ์ที่ทำให้คุณเริ่มคิดเกี่ยวกับวิธีหลีกเลี่ยงโครงสร้างวนซ้ำ
ลุงจามิล

1
FYI: GNU tar สนับสนุนไฟล์เก็บถาวร tar หลายวอลุ่มพร้อม-Mพารามิเตอร์
Steve-o

1
ลุงจามิล: ฉันกำลังเขียน HowTo และหนึ่งในขั้นตอนนั้นเกี่ยวข้องกับการคลายไฟล์บีบอัดหลายไฟล์ (.tar.bz2, .tar.gz, .zip) และเนื่องจากเป็น HowTo ฉันจึงสงสัยว่าบรรทัดคำสั่งที่หรูหราที่สุดที่จะทำคืออะไร :)
SCY

คำตอบ:


38

สิ่งนี้เป็นไปได้ไวยากรณ์ค่อนข้างง่าย:

$ cat *.tar | tar -xvf - -i

ตัวเลือก -i ละเว้น EOF ที่ส่วนท้ายของคลังเก็บ tar จากหน้า man:

-i, --ignore-zeros
ignore blocks of zeros in archive (normally mean EOF)

1
ดูเหมือนว่าจะได้ผลสำหรับฉัน cat *.tar.bz2 | tar -ixjvฉันคำสั่งที่แน่นอนที่ใช้คือ: ขอบคุณ!
scy

1
<สำหรับ tgz> cat * .tgz | tar -xzvf - -i -C / destination / <or> สำหรับไฟล์ใน * .tgz; ทำ tar -xzvf $ file -C / ปลายทาง /; เสร็จแล้ว
Ferroao

27

สำหรับ * .tar.gz

for file in *.tar.gz; do tar -zxf "$file"; done

สำหรับ * .tar.bz2

for file in *.tar.bz2; do tar -jxf "$file"; done

สำหรับ * .tar.xz

for file in *.tar.xz; do tar -Jxf "$file"; done

1
แก้ไขการจัดรูปแบบที่นี่และสิ่งนี้จะสามารถอ่านได้มากขึ้น
eyoung100

มันเยี่ยมมาก รูปแบบก็ดีเช่นกันเพราะนั่นคือลักษณะที่ปรากฏในเครื่อง
smatthewenglish

1
อย่าลืมใส่เครื่องหมายคำพูดล้อมรอบ$fileหากไฟล์ของคุณมีชื่อที่มีช่องว่าง
Alexander Revo

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

2

คุณต้องใช้การวนซ้ำ มันจะไม่ทำลายtarไวยากรณ์บรรทัดคำสั่งเพื่อให้-fตัวเลือกหลายตัว แต่มันจะต้องเพิ่มรหัสในการประมวลผลหลายที่เก็บถาวรในลำดับที่มีเงื่อนไขขอบทุกชนิด (จะเกิดอะไรขึ้นถ้าการเก็บถาวรที่อยู่ตรงกลางผิดรูปแบบ? กลไกการบีบอัดคุณสามารถมีหลาย-Cตัวเลือก (ตัวเลือก GNU tar เพื่อแยกไปยังไดเรกทอรีเฉพาะ) ด้วยหรือไม่สิ่งที่เกี่ยวกับ -K (ตัวเลือก GNU tar เพื่อเริ่มต้นที่ชื่อสมาชิกบางอย่าง)? ... )

ความเป็นไปได้ทางหนึ่งที่หลีกเลี่ยงการforวนซ้ำคือการติดตั้งและเปิดใช้งานAVFSซึ่งเป็นระบบไฟล์FUSEที่ให้การเข้าถึงที่เก็บถาวรอย่างโปร่งใส เก็บแต่ละคู่เป็นไดเรกทอรี/path/to/archive ~/.avfs/path/to/archive#หากคุณต้องการจับคู่ไฟล์เก็บถาวรกับไวด์การ์ดคุณจะมีอุปสรรคในการเพิ่ม#ไวด์การ์ดลงในการแข่งขันไวด์การ์ด มันสามารถทำได้ใน zsh

mountavfs
cp -p ~/.avfs$PWD/{a,b}.tgz\#/* /destination
cp -p ~/.avfs/path/to/source/*.tgz(e\''REPLY=$REPLY\#'\')/* /destination

-1

find . -name "*.tar.gz" -exec tar xzf {} \;


สิ่งนี้ทำอะไร
Pierre.Vriens

1
สิ่งนี้จะแนะนำการเรียกใช้การวนลูปแบบอ้อมโดยนัยหนึ่งครั้งสำหรับแต่ละไฟล์ที่พบและผู้ใช้บอกว่าพวกเขารู้วิธีการทำเช่นนี้แล้ว
Kusalananda

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