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

Rog*_*ger 24 bash wget unzip xargs

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

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

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

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

rua*_*rio 32

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

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

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

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

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | bsdtar -xvf- -C ~/Desktop
Run Code Online (Sandbox Code Playgroud)

  • 我这里有一个 `.zip` 文件,其中包含具有可执行权限的文件。当我下载并通过管道输入 `bsdtar` 时,exec 位会被丢弃。当我下载到磁盘并使用 `bsdtar` 或 `unzip` 解压缩时,exec 位得到尊重。 (2认同)

Saf*_*ver 13

BusyBoxunzip可以使用标准输入并提取所有文件。

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

后面的破折号unzip是使用 stdin 作为输入。

你甚至可以,

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

但这只是多余的unzip file.zip

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


leo*_*eon 10

__CODE__

  • 这不是以管道方式提取de zip.根据您的提议,您需要使用更多的磁盘空间并将其耗尽(如果文件很大,则在SSD中很重要).直接并行下载和提取也更有效. (4认同)
  • 该问题特别要求从管道中解压缩。这个答案使用临时文件,这可能不适用于只读文件系统或其他特定用例 (3认同)
  • 一旦下一个命令仅在前一个命令成功完成后启动,则使用&&会更好.谢谢 (2认同)
  • 同样,-qO- -O tmp.zip是重言式的:您传递-O-然后传递-O tmp.zip在这里没有意义。 (2认同)

Ian*_*son 6

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

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

  • 请注意,无论如何都会在运行unzip之前下载完整文件,这不是原始问题. (4认同)
  • 虽然文件末尾确实有一个索引,其中包含有关哪些文件已从存档中删除的“权威”信息(无需在每次删除时重新生成),但我可以成功地提取一个简单的 ZIP使用 bsdtar 的流水线方式,因为每个文件前面确实有标题。如果存档已被修改,bsdtar 可能会给出不好的结果(“幻影”​​文件会出现,因为直到存档结束时才知道哪些是最新版本)。 (3认同)
  • 真正。不幸的是,zip文件格式将其“中央目录”放在文件的末尾,并且解压缩算法首先在处理文件之前读取该目录。因此,正确解压缩的真正管道解决方案实际上是不可能的。(这对于要处理大型上传的zip文件的Web应用程序也是一个问题-无法以流式处理的方式完成。) (2认同)

Sam*_*ell 5

我会看一下 funzip (http://www.info-zip.org/mans/funzip.html)。它的手册页指出,

...filter for extracting from a ZIP archive in a pipe
Run Code Online (Sandbox Code Playgroud)

抱歉,我没有示例,但看起来它确实带有 Linux 解压缩实用程序。

  • 它只转储第一个文件。不带文件参数的 funzip 充当过滤器;也就是说,它假设 ZIP 存档(或 gzip'd(1) 文件)通过管道传输到标准输入,并将**第一个成员**从存档提取到标准输出。 (6认同)

lan*_*bre 5

只需使用zcat

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | zcat >> myfile.txt
Run Code Online (Sandbox Code Playgroud)
  • 这只会提取第一个文件.在提取第一个文件后,您将看到此错误消息"gzip:stdin有多个条目 - 休息被忽略".