从标准输入解压缩到标准输出 - funzip,python

chi*_*bes 8 linux compression python bash pipe

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

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

funzip error: invalid compressed data--length error
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 14

重新发布我的答案

BusyBoxunzip可以接受标准输入并将所有文件提取到标准输出。例如,当您使用wgetas stdin 时,

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | busybox unzip -p -
Run Code Online (Sandbox Code Playgroud)

-p将文件提取到管道。后面的破折号是使用 stdin 作为输入。

你也可以,(就像之前的答案一样)

cat file.zip | busybox unzip -p -
Run Code Online (Sandbox Code Playgroud)

但这只是多余的unzip -p file.zip

如果您的发行版默认使用 BusyBox(例如 Alpine),则只需运行unzip -p -.


eni*_*ist 8

使用bsdtar来自libarchive

> curl 'https://example.com/some.zip' | bsdtar -xOf - | less
Run Code Online (Sandbox Code Playgroud)


sho*_*hok 4

只需使用zcat. 例如:

cat file.zip | zcat

请注意,在上面的示例中,第一部分 ( cat file.zip) 是多余的,因为您可以简单地发出zcat file.zip并获得相同的结果。我包含它只是为了表明zcat能够读取stdin

  • 错误的答案:zcat 不适用于 zip 文件!这个答案应该被否决。可以使用 jar 在这里找到解决方案:https://unix.stackexchange.com/questions/2690/how-to-redirect-output-of-wget-as-input-to-unzip (14认同)
  • 不可以,当使用包含多个文件的 zip 文件时,它在 CentOS 6.9 上不起作用。我得到“gzip:zip文件有多个条目--rest被忽略”,这是完全可以理解的,因为管道创建了一个流,而流不可查找,因此“zcat”无法跳转到文件末尾来检索文件列表。因此,简而言之,“zcat”(实际上是“gunzip”,因为“zcat”这么称呼它)不适用于 zip 文件,除非它们仅包含一个文件。尝试一下,你就会看到。 (5认同)
  • 我的印象是 OP 确实想将单个压缩文件输出到“stdout”,而不是整个 zip 存档。毕竟,当您无法分辨每个文件的开始/结束时,在“stdout”上显示多个串联文件有什么意义呢? (5认同)