web-dev-qa-db-ja.com

アーカイブをダウンロードして、アーカイブをディスクに保存せずに抽出する方法は?

アーカイブをダウンロードして、特定のディレクトリに展開したいと思います。これが私がこれまでやってきた方法です:

wget http://downloads.mysql.com/source/dbt2-0.37.50.3.tar.gz
tar zxf dbt2-0.37.50.3.tar.gz
mv dbt2-0.37.50.3 dbt2

代わりに、tar.gzをディスクに書き込まずに、アーカイブをダウンロードして解凍しますオンザフライ。これは、wgetの出力をtarにパイプし、tarにターゲットを指定することで可能になると思いますが、実際には、これらを組み合わせる方法がわかりません。

69
Benjamin

これを行うには、wgetにペイロードをstdoutに出力し(フラグ-O-)、独自の出力を抑制します(フラグ-q)。

wget -qO- your_link_here | tar xvz -

ターゲットディレクトリを指定するには:

wget -qO- your_link_here | tar xvz - -C /target/directory

更新

GNU tar

wget -qO- your_link_here | tar --transform 's/^dbt2-0.37.50.3/dbt2/' -xvz

すべてを1つのステップで実行できるはずです。

-q静か

-O - stdoutへの出力

105
Joseph R.

もう1つのオプションは、デフォルトでstdoutに書き込むcurlを使用することです。

curl -s some_url | tar xvz -C /tmp
15
Zlemini

このワンライナーはトリックを行います:

tar xvzf -C /tmp/ < <(wget -q -O - http://foo.com/myfile.tar.gz)

簡単な説明:括弧の右側が最初に実行されます(-qはwgetに静かに実行するように指示し、-O -はstdoutに出力を書き込むために使用されます)。

次に、Bash <(のプロセス置換演算子を使用して名前付きパイプを作成し、名前付きパイプを作成します。このようにして、一時ファイル記述子を作成し、<ファイルリダイレクト演算子を使用してその記述子の内容をtarに送信します。

11
ItsMe