web-dev-qa-db-ja.com

Bash-パイプされたZipファイルを解凍する方法( "wget -qO-"から)

次のように、パイプされたZipファイルを解凍する方法に関するアイデア:

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.Zip

通常のファイルと同じように、ファイルをディレクトリに解凍したいと思いました。

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.Zip | unzip -d ~/Desktop
27
Roger
wget -qO- -O tmp.Zip http://downloads.wordpress.org/plugin/akismet.2.5.3.Zip && unzip tmp.Zip && rm tmp.Zip
10
leon

Zipファイル形式には、アーカイブの最後にディレクトリ(インデックス)が含まれています。このディレクトリは、アーカイブ内の各ファイルの場所を示しているため、アーカイブ全体を読み取ることなく、すばやくランダムにアクセスできます。

これは、パイプを介してZipアーカイブを読み取ろうとすると問題が発生するように見えます。インデックスは最後までアクセスされないため、ファイルが完全に読み取られて使用できなくなるまで、個々のメンバーを正しく抽出できません。 。そのため、アーカイブがパイプを介して提供される場合、ほとんどのZipデコンプレッサが単に失敗するのは当然のことです。

アーカイブの最後のディレクトリは、ファイルメタ情報がアーカイブに格納されるonlyの場所ではありません。さらに、冗長性を確保するために、個々のエントリのローカルファイルヘッダーにもこの情報が含まれています。

インデックスが利用できない場合、すべてのZipデコンプレッサがローカルファイルヘッダーを使用するわけではありませんが、tarおよびcpioフロントエンドはlibarchive(別名bsdtarおよびbsdcpio)にcanおよびwillパイプを介して読み取る場合は、次のことが可能です。

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.Zip | bsdtar -xvf- -C ~/Desktop
30
ruario

以下はbashでは機能しませんが、zshでは機能します。多くのzshユーザーがここで終了する可能性があるため、それでもまだ役立つ場合があります。

unzip =( wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.Zip )
6
Ian Robertson

zcatを使用するだけ

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.Zip | zcat >> myfile.txt
  • これは最初のファイルのみを抽出します。最初のファイルを解凍すると、「gzip:stdinには複数のエントリがあります。残りは無視されます」というエラーメッセージが表示されます。
5
lanzalibre

Funzip(http://www.info-Zip.org/mans/funzip.html)を見てみましょう。そのマニュアルページには、

...filter for extracting from a Zip archive in a pipe

申し訳ありませんが、例はありませんが、Linuxのunzipユーティリティが付属しているようです。

4
Sam Cantrell

BusyBoxのunzipは、標準入力を取り、すべてのファイルを抽出できます。

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.Zip | busybox unzip -

unzipの後のダッシュは、stdinを入力として使用するためのものです。

あなたもできます

cat file.Zip | busybox unzip -

しかし、それはunzip file.Zipの冗長です。

ディストリビューションがデフォルトでBusyBoxを使用している場合(Alpineなど)、unzip -を実行します。

3
Saftever