web-dev-qa-db-ja.com

stdinからstdoutに解凍-funzip、python

目標は、標準入力からZipファイルを読み取り、標準出力に解凍することです。

Funzipは機能し、私が探しているソリューションです。Zipには単一のファイルが含まれていますが、残念ながら、圧縮ファイルのサイズが約1 GB以上の場合、funzipは失敗します。

funzip error: invalid compressed data--length error

更新:上記のエラーが実際のエラーを示していない可能性があることを発見しました。 2つの非圧縮ファイルを比較すると、1つは従来の方法で解凍され、もう1つはfunzipを使用してパイプ経由で(上記のエラーはstderrに書き込まれます)、ファイルは同一です。これを開いたままにして、確認または報告できるようにします。

Pythonを使用した関連ソリューション: パイプから飛んでいるファイルを解凍する

ただし、この出力はファイルに送られます。

4
chillvibes

単にzcatを使用します。例えば:

cat file.Zip | zcat

上記の例では、cat file.Zipを発行するだけで同じ結果が得られるという意味で、最初の部分(zcat file.Zip)は冗長であることに注意してください。 zcatstdinから読み取ることができることを示すためだけに含めました

5
shodanshok

解凍(fileへのリダイレクトあり):

cat file.gz | gunzip -c - > file

圧縮(file.gzへのリダイレクトあり)):

cat file | gzip -c - > file.gz
2
TomOnTime

私の答え の再投稿:

BusyBoxのunzipは、標準入力を取り、すべてのファイルを標準出力に抽出できます。たとえば、wgetをstdinとして使用すると、

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

-pは、パイプするファイルを抽出します。後のダッシュは、入力としてstdinを使用することです。

また、( 前の 回答と同じように)

cat file.Zip | busybox unzip -p -

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

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

1
Saftever