質問: wgetの出力をunzipへの入力としてリダイレクトするにはどうすればよいですか? これからファイルをダウンロードする必要があります link 。ファイルのダウンロードはzipファイルで、現在のフォルダーで解凍する必要があります。通常は、最初にダウンロードしてから、unzipコマンドを実行します。$ wget http://www.vim.org/scripts/download_script.php?src_id=11834 -o temp.zip $ unzip temp.zip しかし、この方法では、2つのコマンドを実行し、最初のコマンドの完了を待って次のコマンドを実行する必要があります。また、ファイルの名前を知っている必要がありますtemp.zipを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:あいまいなリダイレクト また、wgetは2回実行され、ファイルを2回ダウンロードしました。
回答: これは、同様の質問に対する 私の答え の再投稿です。zipファイル形式には、アーカイブの最後にディレクトリ(インデックス)が含まれています。このディレクトリは、アーカイブ内の各ファイルの場所を示しているため、アーカイブ全体を読み取ることなく、すばやくランダムにアクセスできます。これは、パイプを介してzipアーカイブを読み取ろうとすると問題が発生するように見えます。インデックスは最後までアクセスされないため、ファイルが完全に読み取られて使用できなくなるまで、個々のメンバーを正しく抽出できません。 。そのため、アーカイブがパイプを介して提供される場合、ほとんどのzipデコンプレッサが単に失敗するのは当然のことです。アーカイブの最後のディレクトリは、ファイルメタ情報がアーカイブに格納されるonlyの場所ではありません。さらに、冗長性を確保するために、個々のエントリのローカルファイルヘッダーにもこの情報が含まれています。インデックスが利用できない場合、すべてのzipデコンプレッサがローカルファイルヘッダーを使用するわけではありませんが、tarおよびcpioフロントエンドはlibarchive(別名bsdtarおよびbsdcpio)にcanおよびwillパイプを介して読み取る場合は、次のことが可能です。wget -qo- http://example.org/file.zip | bsdtar -xvf-