wgetの出力をunzipへの入力としてリダイレクトする方法は?

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

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

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

しかし、このように、2つのコマンドを実行し、最初のコマンドが完了するのを待って次のコマンドを実行する必要があります。また、ファイルの名前を知っている必要がありますtemp.zipunzipに渡します。

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回ダウンロードしました。

コメント

  • 後者の例では、?がシェルの特殊文字であるため、wgetが2回実行された可能性があります。 。URLを” “に入れると役立つはずです。
  • このスレッドには解決策があるようです。Haven’自分で試してみました。 serverfault.com/questions/26474/ …

回答

ファイルを一時ファイルにダウンロードする必要があります。理由は(解凍を引用) manページ):

funzip(および最初のmのみ)を除いて、標準入力から読み取られたアーカイブはまだサポートされていません。アーカイブの残りの部分を抽出できます。

コマンドをまとめるだけです:

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 

コメント

  • wget file.zip && unzip file.zip wget file.zip; unzip file.zipと同じですか、それとも一方が他方よりも優先されますか?ありがとう:)
  • @NextLocal wget && unzipは、wgetが成功した場合にのみunzipを実行します。 wget ; unzipはとにかく解凍を実行し、存在しないファイルを指している可能性があります。
  • funzipが私が探していた答えでした。 Terraformは(何らかの理由で)バイナリをzipアーカイブ内の単一ファイルとして’パッケージ化するため、これは私にとって完璧でした。

回答

これは、同様の質問に対する私の回答の再投稿です:

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

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

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

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

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

コメント

  • これは優れています!! tarは、圧縮されていないデータのサイズが間違っている(0が予想される)という警告を表示しますが、ファイル自体は損傷していないように見えます。これはインデックスがないためだと思います。
  • 実行可能権限を持つファイルを含む.zipファイルがここにあります。ダウンロードしてbsdtarにパイプすると、execビットが破棄されます。ディスクにダウンロードしてbsdtarまたはunzipで抽出すると、execビットが尊重されます。
  • // 、@ GolarRamblar、理由を見つけたことがありませんか?
  • @NathanBasanese:ここにが答えです。つまり、ZIPアーカイブにはそのような情報を保存する場所が2つあり、一貫性がない可能性があります。bsdtarが開くファイルがシーク可能かどうかによって、どちらか一方の場所が使用されます。 。

回答

JDKがインストールされている場合は、jar

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

コメント

  • jarは’ファイルのアクセス許可を保持しません。それ以外の場合は、すばらしいトリックです。
  • ファイルパラメータを指定する必要はありません。| jar xv
  • 私も、jarunzipの代わりに使用できるという仮定に噛まれました。残念ながら、jarは抽出されたファイルを復元しません’権限;
  • | jar x
  • jarは、UTF-8ファイル名の処理がはるかに優れています。 unzip混乱したもの。

回答

私はしませんwgetの出力をunzipにパイプするのも面倒だと思います。

wikipediaから “ZIP(ファイル形式)” の記事:

ZIPファイルは、ファイルの最後にある中央ディレクトリの存在によって識別されます。

wgetは、unzipで作業を行う前にダウンロードを完全に終了する必要があるため、考えられるように織り交ぜることなく、順番に実行されます。

回答

私の回答の再投稿

BusyBoxのunzipはstdinを取得してすべてのファイルを抽出できます。

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

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

できます。

cat file.zip | busybox unzip - 

しかし、それはunzip file.zip

ディストロがBusyBoを使用している場合デフォルトではx(例: Alpine)、unzip -を実行するだけです。

コメント

  • @Saftever の回答、i ‘はコメントできません。busyboxは機能しますが、1.27.0より古いバージョンはウォン’ lseekが冗長であるため、changelog busybox.net

回答を参照してください。 h2>

適切な構文は次のようになります。

$ unzip <(curl -sL https://www.winpcap.org/archive/1.0-docs.zip) 

ただし、エラーのために機能しません( Debian Info-ZIP ):

lseek(3, 0, SEEK_SET) = -1 ESPIPE (Illegal seek) Archive: /dev/fd/63 End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive. unzip: cannot find zipfile directory in one of /dev/fd/63 or /dev/fd/63.zip, and cannot find /dev/fd/63.ZIP, period. 

またはBSD / OS Xの場合:

Trying to read large file (> 2 GiB) without large file support 

これは、標準のzipツールが主に lseek関数ファイルオフセットを最後に設定して、中央ディレクトリレコードの終わりを読み取ります。これはアーカイブ構造の最後にあり、リストを読み取る必要があります。ファイルの(参照: Zipファイル形式の構造)。したがって、入力オブジェクトをlseek関数で配置できないため、ファイルをFIFO、パイプ、端末デバイス、またはその他の動的にすることはできません。

これで、次の回避策:

  • 異なる種類の圧縮(tar.gzなど)を使用します。
  • 2つの別々のコマンドを使用する必要があります。
  • (他の回答で提案されているように)代替ツールを使用します。
  • 複数のコマンドを使用するためのエイリアスまたは関数を作成します。

コメント

  • それでもFIFOである可能性があると思います。 ‘は、EOFまでFIFOから読み取りを続ける必要があります(FIFO全体をメモリまたは一時ファイルに効果的にバッファリングします)。スクリプトの作成を容易にするために完全に実行可能ですが、あまり役に立ちません。

回答

ファイルが1つしかない場合zipの場合、zcatまたはgunzipを使用できます:

wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | gunzip 

参考:私のシステムでのgunzipzcatの定義は次のとおりです:

$ grep ^exec $(which gunzip zcat) /bin/gunzip:exec gzip -d "$@" /bin/zcat:exec gzip -cd "$@" 

回答

zipアーカイブには目次が含まれていることが多いため、シーケンシャルではありません。ファイルの最後にあるため、ストリーミング解凍が困難です。

別の解決策は、.tar.gz

たとえば、GitHubから.zipファイルをダウンロードする場合、ほとんどの場合.tar.gz利用可能なバージョン。

たとえば、

パターンに注意してください。.zip.tar.gzに置き換えて、| tar xzf -

回答

これは私にとって非常にうまく機能します:

 tar xvf <(curl -sL http://www.vim.org/scripts/download_script.php?src_id=11834) jar xvf <(curl -sL http://www.vim.org/scripts/download_script.php?src_id=11834) wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | tar xvf - wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | jar xvf -  

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です