ให้ tar ตรวจจับการบีบอัดอัตโนมัติเมื่อสกัดจาก stdin


16

ฉันใช้ GNU tar มันสามารถตรวจจับประเภทการบีบอัดอัตโนมัติเมื่อทำการบีบอัด / คลายการบีบอัดไฟล์ แต่ฉันต้องคลายการบีบอัดไฟล์จาก stdin และไม่ทราบประเภทการบีบอัด ฉันสังเกตเห็นว่าน้ำมันดินสามารถให้คำแนะนำที่ถูกต้องแก่ฉันเช่น:

tar: Archive is compressed. Use -z option

แต่ฉันต้องการให้ tar ใช้ตัวเลือกการบีบอัดนั้นโดยอัตโนมัติโดยไม่ต้องให้ฉันป้อนอาร์กิวเมนต์นั้น ฉันจะทำสิ่งนั้นได้อย่างไร ทำไมไม่ tar เพียงแค่ขยายขนาดเพราะมันรู้ชนิดการบีบอัดอยู่แล้ว?

ขอขอบคุณ!


มันไม่ยากที่จะพัฒนา แต่มันก็ไม่ได้ทำมาจนถึงตอนนี้
peterh - Reinstate Monica

3
เหตุผลที่ไม่สามารถทำได้คือtarไม่ทราบว่ามีข้อมูลประเภทใดstdinจนกระทั่งเมื่อได้อ่านแล้วและมันก็สายเกินไปที่จะเรียกโปรแกรม uncompress รองรับ gzip, bzip2 และอื่น ๆ การแก้ไขปัญหานี้ไม่ใช่เรื่องง่าย (มันจะต้องบัฟเฟอร์ข้อมูล) ดังนั้นเพียงแค่บอกให้คุณลองอีกครั้ง
Kevin Panko

@KevinPanko ทำไมมันสายเกินไป? ไม่มันไม่สาย เขาอ่าน fe 4K ตัวแรกในบัฟเฟอร์ทดสอบประเภทการบีบอัด (ถ้ามี) จากนั้นเรียกโปรแกรม การบัฟเฟอร์นี้คือ 10-20 บรรทัดของรหัส C เพิ่มเติม
peterh - Reinstate Monica

2
เมื่อมาถึงจุดว่าในเวลาเมื่อมันรู้ว่าสิ่งที่มันมีข้อมูลก็จะไม่สามารถใช้งานง่ายfork()/ exec()วิธีการเพื่อให้ท่อข้อมูลผ่านยูทิลิตี้ยกเลิกการบีบอัด ยูทิลิตี้จะอ่านจากstdinไปป์และ 4K ตัวแรกจะหายไป ไม่มีวิธีที่จะนำข้อมูลกลับเข้าไปในท่อหลังจากอ่าน
Kevin Panko

3
@KevinPanko: cat buffer - | gunzipมันอาจจะทำโดยฟอร์กสองกระบวนการแม้ว่าโดยทั่วไปทำเทียบเท่า (หรือมิ
ฉะนั้นจะ

คำตอบ:


10

นี่ไม่ใช่คำตอบที่คุณต้องการฟัง แต่ GNU tar ไม่รองรับตามคู่มือ:

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

$ cat archive.tar.gz | tar tf -
tar: Archive is compressed.  Use -z option
tar: Error is not recoverable: exiting now

หากคุณเห็นการวินิจฉัยดังกล่าวเพียงเพิ่มตัวเลือกที่แนะนำในการเรียกใช้ GNU tar:

$ cat archive.tar.gz | tar tzf -

- 8.1.1 การสร้างและอ่านไฟล์บีบอัด


2
โปรดทราบว่าการทำงานในคำสั่ง tar บน OSX แต่ไม่ใช่ใน Linux โดยใช้ GNU tar ดังนั้นนี่อาจแก้ไขได้
ฌอนเพอร์รี่

8

ในที่สุดฉันก็รู้ว่าเหตุผลที่ฉันไม่สามารถให้ tar ตรวจจับและขยายขนาดไฟล์เก็บถาวรจาก stdin ก็คือฉันใช้ GNU tar BSD tar สามารถทำได้โดยอัตโนมัติโดยไม่มีปัญหา ดังนั้นฉันจึงตัดสินใจใช้ bsdtar แทน tar ในสคริปต์ของฉันตอนนี้

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