biarkan tar otomatis mendeteksi tipe kompresi ketika mengekstraksi dari stdin

16

Saya menggunakan tar GNU. Itu dapat secara otomatis mendeteksi tipe kompresi ketika mengompresi / mendekompresi file. Tapi saya perlu mendekompres arsip dari stdin dan tipe kompres tidak diketahui. Saya perhatikan bahwa tar dapat memberi saya saran yang benar seperti:

tar: Archive is compressed. Use -z option

Tapi saya ingin tar menggunakan opsi kompresi itu secara otomatis tanpa meminta saya untuk memasukkan argumen itu. Bagaimana saya bisa melakukan itu? Kenapa tidak tar dekompresi saja karena sudah tahu tipe kompresi?

Terima kasih!

james
sumber
Itu tidak sulit untuk dikembangkan, tetapi tidak dilakukan sampai sekarang.
peterh
3
Alasannya tidak bisa melakukan ini adalah karena tartidak tahu tipe data apa yang dimilikinya stdinsampai setelah membacanya, dan saat itu sudah terlambat untuk memanggil program uncompress. Ini mendukung gzip, bzip2, dan lainnya. Mengatasi masalah ini tidak mudah (harus buffer data), jadi itu hanya memberitahu Anda untuk mencoba lagi.
Kevin Panko
@KevinPanko Kenapa terlambat? Tidak, belum terlambat. Dia membaca fe 4K pertama dalam buffer, menguji jenis kompresinya (jika ada), lalu memanggil program. Buffer ini adalah 10-20 baris kode C tambahan.
peterh
2
Pada saat itu ketika mengetahui data apa yang dimilikinya, ia tidak lagi dapat menggunakan metode fork()/ sederhana exec()untuk menyalurkan data melalui utilitas yang tidak dikompres. Utilitas akan membaca dari stdinpipa dan 4K pertama sekarang akan hilang. Tidak ada cara untuk mengembalikan data ke dalam pipa setelah membacanya.
Kevin Panko
3
@KevinPanko: Itu bisa dilakukan dengan memalsukan dua proses, pada dasarnya, melakukan hal yang setara cat buffer - | gunzip. (Atau, I / O non-blocking dapat digunakan untuk menghindari kebutuhan akan proses tambahan.)
Ilmari Karonen

Jawaban:

10

Ini bukan jawaban yang ingin Anda dengar, tetapi ini tidak didukung oleh GNU tar menurut manualnya:

Satu-satunya kasus ketika Anda harus menentukan opsi dekompresi saat membaca arsip adalah ketika membaca dari pipa atau dari tape drive yang tidak mendukung akses acak. Namun, dalam hal ini tar GNU akan menunjukkan opsi mana yang harus Anda gunakan. Sebagai contoh:

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

Jika Anda melihat diagnostik seperti itu, cukup tambahkan opsi yang disarankan ke permohonan GNU tar:

$ cat archive.tar.gz | tar tzf -

- 8.1.1 Membuat dan Membaca Arsip Terkompresi

Kevin Panko
sumber
2
Catatan ini berfungsi dalam perintah tar pada OSX tetapi tidak di Linux menggunakan tar GNU. Jadi ini bisa diperbaiki.
Sean Perry
8

Akhirnya, saya menyadari alasan saya tidak bisa membiarkan tar mendeteksi dan mendekompresi arsip dari stdin adalah karena saya menggunakan GNU tar. Tar BSD dapat melakukannya secara otomatis tanpa masalah. Jadi saya memutuskan untuk menggunakan bsdtar bukan tar dalam skrip saya sekarang.

james
sumber