目标是从 stdin 读取一个 zip 文件并解压缩到 stdout。
Funzip 可以工作并且是我正在寻找的解决方案,zip 包含一个文件,不幸的是当压缩文件大小约为 1GB 或更大时 funzip 会失败:
funzip error: invalid compressed data--length error
更新:我发现上述错误可能并不表示实际错误。比较两个未压缩的文件,一个以传统方式解压,另一个通过使用 funzip 的管道解压(上述错误写入 stderr),这两个文件是相同的。我想保持这个状态,以便可以确认或报告。
使用python的相关解决方案: 解压通过管道传入的文件
然而,这个输出被定向到一个文件。
答案1
转贴我的答案:
BusyBoxunzip
可以使用 stdin 并将所有文件提取到 stdout。例如,当您使用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 -
。
答案2
使用bsdtar
自libarchive
:
> 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