Bash - 如何解压缩管道zip文件(来自“wget -qO-”)

时间:2011-08-20 14:54:51

标签: bash wget unzip xargs

有关如何解压缩管道zip文件的任何想法:

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

我希望将文件解压缩到一个目录,就像我们以前用普通文件一样:

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

7 个答案:

答案 0 :(得分:28)

ZIP文件格式包括存档末尾的目录(索引)。该目录说明每个文件所在的归档中的位置,从而允许快速随机访问,而无需读取整个存档。

这在尝试通过管道读取ZIP存档时会出现问题,因为直到最后才访问索引,因此在文件完全读取之后无法正确提取单个成员,并且不再可用。因此,当通过管道提供存档时,大多数ZIP解压缩器都会失败,这似乎并不令人惊讶。

归档末尾的目录不是 only 位置,其中文件元信息存储在归档中。此外,出于冗余目的,各个条目还将此信息包含在本地文件头中。

虽然并非每个ZIP解压缩程序都会在索引不可用时使用本地文件头,但tar和cpio前端结束于libarchive(又名bsdtar和bsdcpio)可以并且在读取管道时这样做,意味着以下是可能的:

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | bsdtar -xvf- -C ~/Desktop

答案 1 :(得分:9)

wget -qO- -O tmp.zip http://downloads.wordpress.org/plugin/akismet.2.5.3.zip && unzip tmp.zip && rm tmp.zip

答案 2 :(得分:6)

虽然以下内容在bash中不起作用,但它可以在zsh中使用。由于许多zsh用户可能会在这里结束,因此它可能仍然有用:

unzip =( wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip )

答案 3 :(得分:5)

只需使用zcat

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | zcat >> myfile.txt
  • 这只会提取第一个文件。在提取第一个文件后,您将看到此错误消息“gzip:stdin有多个条目 - 忽略”。

答案 4 :(得分:4)

我来看看funzip(http://www.info-zip.org/mans/funzip.html)。它的手册页注释,

...filter for extracting from a ZIP archive in a pipe

抱歉,我没有一个例子,但看起来它确实附带了Linux解压缩实用程序。

答案 5 :(得分:3)

BusyBox的unzip可以使用stdin并提取所有文件。

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

unzip后的破折号是使用标准输入作为输入。

您甚至可以

cat file.zip | busybox unzip -

但这只是unzip file.zip的多余。

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

答案 6 :(得分:0)

转发my answer

我编写了一个 Python (2.x) 脚本来对 ZIP 档案进行流式提取,您可以从这里获取它:https://raw.githubusercontent.com/pts/unzip_scan/master/unzip_scan.py。用法:cat file.zip | sh unzip_scan.py -