从 stdin 解压到 stdout - funzip,python

从 stdin 解压到 stdout - funzip,python

目标是从 stdin 读取一个 zip 文件并解压缩到 stdout。

Funzip 可以工作并且是我正在寻找的解决方案,zip 包含一个文件,不幸的是当压缩文件大小约为 1GB 或更大时 funzip 会失败:

funzip error: invalid compressed data--length error

更新:我发现上述错误可能并不表示实际错误。比较两个未压缩的文件,一个以传统方式解压,另一个通过使用 funzip 的管道解压(上述错误写入 stderr),这两个文件是相同的。我想保持这个状态,以便可以确认或报告。

使用python的相关解决方案: 解压通过管道传入的文件

然而,这个输出被定向到一个文件。

答案1

转贴我的答案

BusyBoxunzip可以使用 stdin 并将所有文件提取到 stdout。例如,当您使用wgetstdin 时,

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 -

答案2

使用bsdtarlibarchive

> curl 'https://example.com/some.zip' | bsdtar -xOf - | less

答案3

只需使用zcat。例如:

cat file.zip | zcat

请注意,在上面的例子中,第一部分(cat file.zip)是多余的,因为您可以直接发出zcat file.zip并获得相同的结果。我将其包括在内只是为了表明zcat能够从stdin

答案4

解压缩(重定向至file):

cat file.gz | gunzip -c - > file

压缩(重定向至file.gz)):

cat file | gzip -c - > file.gz

相关内容