wgetの出力を解凍された入力にリダイレクトする方法は?

wgetの出力を解凍された入力にリダイレクトする方法は?

ここからファイルをダウンロードする必要があります協会。ダウンロードしたファイルはzipファイルなので、現在のフォルダに解凍する必要があります。

通常、最初にダウンロードしてからunzipコマンドを実行します。

wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip
unzip temp.zip

temp.zipただし、この方法で2つのコマンドを実行し、次のコマンドを実行する前に最初のコマンドが完了するのを待ち、それを提供するファイル名を知る必要がありますunzip

wget出力をにリダイレクトできますかunzip?それはまるで

unzip < `wget http://www.vim.org/scripts/download_script.php?src_id=11834`

しかし、それはうまくいきませんでした。

bash: `wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip`: ambiguous redirect

また、wget2回実行され、ファイルが2回ダウンロードされました。

答え1

次の理由で、ファイルを一時ファイルとしてダウンロードする必要があります(圧縮解除マニュアルページの引用)。

funzip(アーカイブの最初のメンバーのみを抽出できます)を除いて、標準入力から読み取られたアーカイブはまだサポートされていません。

次のコマンドを一緒に結合するだけです。

wget "http://www.vim.org/scripts/download_script.php?src_id=11834" -O temp.zip
unzip temp.zip
rm temp.zip

ただし、より柔軟にするには、入力を保存するためにスクリプトに入れる必要があり、誤って上書きしないようにするには、mktemp次のコマンドを使用して一時ファイルの安全なファイル名を作成できます。

#!/bin/bash
TMPFILE=`mktemp`
PWD=`pwd`
wget "$1" -O $TMPFILE
unzip -d $PWD $TMPFILE
rm $TMPFILE

答え2

これが渡される私の答え同様の質問の場合:

ZIPファイル形式には、アーカイブの末尾に目次(インデックス)が含まれています。このディレクトリはアーカイブ内の各ファイルの場所を説明しているため、アーカイブ全体を読み取ることなく高速かつランダムにアクセスできます。

パイプを介してZIPアーカイブを読み取ろうとすると、インデックスが最後までアクセスされず、ファイルが完全に読み取られ、使用できなくなるまで個々のメンバーを正しく抽出できないため、問題が発生しているようです。したがって、アーカイブがパイプを介して提供されるとき、ほとんどのZIP圧縮解除が失敗することは驚くべきことではありません。

アーカイブの末尾にあるディレクトリは次のとおりです。ただファイルメタ情報が保存されるアーカイブの場所です。また、個々のエントリには、冗長性のためにローカルファイルヘッダーにこの情報が含まれています。

インデックスが使用できない場合、すべてのZIP圧縮解除器がローカルファイルヘッダーを使用するわけではありませんが、tarおよびcpioフロントエンドはlibarchive(つまりbsdtarとbsdcpio)を指します。できます。パイプからの読み込み中にこれを行うと、次のことができます。

wget -qO- http://example.org/file.zip | bsdtar -xvf-

答え3

JDKがインストールされている場合は、次のものを使用できますjar

wget -qO- http://example.org/file.zip | jar xvf /dev/stdin

答え4

wgetの出力をunzipにパイプしたくないようです。

ウィキペディアで「ZIP(ファイル形式)」記事:

ZIPファイルは、ファイルの末尾にある中央ディレクトリとして識別されます。

wgetは、解凍がタスクを実行する前にダウンロードを完全に完了する必要があるため、思ったように互いに絡み合っておらず、順番に実行されます。

関連情報