標準入力から抽出するときにtarに圧縮タイプを自動検出させます


16

GNU tarを使用します。ファイルの圧縮/解凍時に圧縮タイプを自動検出できます。しかし、標準入力からアーカイブを解凍する必要があり、圧縮タイプは不明です。tarを使用すると、次のような正しい提案ができることに気付きました。

tar: Archive is compressed. Use -z option

しかし、その引数を入力するように要求することなく、tarがその圧縮オプションを自動的に使用するようにします。どうやってやるの?圧縮タイプを既に知っているので、なぜtarは単に解凍しないのですか?

ありがとうございました!


開発するのは難しくありませんでしたが、今まで行われていません。
peterh -復活モニカ

3
これができない理由は、それが読み取られるまで、tarどのタイプのデータを保持しているのかわからないためstdin、解凍プログラムを呼び出すには遅すぎます。gzip、bzip2などをサポートしています。この問題を回避するのは簡単ではありません(データをバッファリングする必要があります)ので、再試行するよう指示されます。
ケビン・パン粉

@KevinPankoなぜ遅すぎるのか?いいえ、遅れていません。彼は、バッファー内の最初の4Kを読み取り、その圧縮タイプ(ある場合)をテストしてから、プログラムを呼び出します。このバッファリングは、追加のCコードの10〜20行でした。
peterh -復活モニカ

2
持っているデータがわかっている時点では、単純なfork()/ exec()メソッドを使用して、圧縮解除ユーティリティを介してデータをパイプすることはできません。ユーティリティはstdinパイプから読み取り、最初の4Kは失われます。データを読み込んだ後にパイプにデータを戻す方法はありません。
ケビンパンコ

3
@KevinPanko:2つのプロセスをフォークすることで実行できますが、基本的にはに相当しcat buffer - | gunzipます。(あるいは、追加のプロセスの必要性を回避するために、ノンブロッキングI / Oを使用できます。)
Ilmari Karonen

回答:


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
これはOSXのtarコマンドでは機能しますが、GNU tarを使用するLinuxでは機能しないことに注意してください。したがって、これ修正できます。
ショーンペリー

8

最後に、tarにstdinのアーカイブを検出させて解凍させることができない理由は、GNU tarを使用していることに気付きました。BSD tarは問題なく自動的に実行できます。そこで、スクリプトでtarの代わりにbsdtarを使用することにしました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.