Bash-如何解压缩管道压缩文件(从“wget-qO-”中)

Bash-如何解压缩管道压缩文件(从“wget-qO-”中),bash,wget,unzip,xargs,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 我想看看funzip(http://www.info-zip.org/ma

关于如何解压缩管道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
我想看看funzip(http://www.info-zip.org/mans/funzip.html). 它的手册页指出

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

很抱歉,我没有一个示例,但它看起来确实与Linux解压实用程序一起提供。

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

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

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

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

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

虽然索引不可用时,并非每个ZIP解压缩程序都会使用本地文件头,但在通过管道读取时,libarchive的tar和cpio前端(也称为bsdtar和bsdcpio)可以并将使用本地文件头,这意味着可以:

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

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

BusyBox的
解压
可以获取stdin并提取所有文件

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | busybox unzip -
解压后的破折号将使用标准输入作为输入

你甚至可以

cat file.zip | busybox unzip -
但这只是
解压file.zip的多余部分

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

重新发布:


我编写了一个Python(2.x)脚本来对ZIP归档文件进行流式提取,您可以从这里获得它:。用法:
cat file.zip | sh unzip_scan.py-

如果上一个命令成功完成,则在下一个命令启动后使用&&会更好。感谢这不是以管道方式提取解压缩。根据您的建议,您需要使用更多的磁盘空间,并将其磨损(如果文件较大,则在SSD中很重要)。直接并行下载和提取也更有效。而且,
-qO--O tmp.zip
是重言式的:你先传递
-O-
,然后传递
-O tmp.zip
,这在这里是毫无意义的。这个问题特别要求从管道中解压缩。这个答案使用的是临时文件,这些文件可能无法在只读文件系统或其他特定用例上工作。虽然问题是有效的,但如果您使用git与WordPress一起工作,那么现在每个文件都有一个git镜像。如果不是您的情况,请忽略我的评论:)否则,您可以省去如何使用这样一个路径来自动安装的问题,然后使用Git submodule/Composer。请注意,这将在运行解压之前下载完整文件,这不是原始问题。True。不幸的是,zip文件格式将其“中心目录”放在文件末尾,解压算法在处理文件之前首先读取该目录。因此,一个真正的管道解决方案,正确解开拉链是不可能的。(对于希望处理大型上传zip文件的web应用程序来说,这也是一个问题——无法以流式方式完成。)虽然文件末尾确实有一个索引,其中包含已从存档中删除的文件的“权威”信息(无需在每次删除时重新生成该索引),我可以使用bsdtar以流水线方式成功地提取一个简单的ZIP,因为每个文件前面都有标题。如果归档文件被修改,bsdtar可能会给出不好的结果(“幻影”文件会出现,因为直到归档文件结束时才知道哪些文件是最新版本)。它只转储第一个文件。没有文件参数的funzip充当过滤器;也就是说,它假设一个ZIP存档(或一个gzip'd(1)文件)正在通过管道传输到标准输入,并将存档中的第一个成员提取到标准输出。我不时卷曲的一些文件只是压缩的单个文件(不知道为什么,它们不是特别大),我无法控制它们是否采用这种格式。使用
zcat
是我在这里的解决方案!我这里有一个
.zip
-文件,其中包含具有可执行权限的文件。当我下载并导入
bsdtar
时,exec位会被丢弃。当我下载到磁盘并使用
bsdtar
unzip
解压时,执行位将得到尊重。Busybox 1.22.0在Debian中使用
存档时失败:-解压:lseek:非法搜索
。你使用了什么版本的Busybox?Ubuntu18.10上的v1.27.2这在Alpine 3.10上对我不起作用(通过Docker)。(我不是对你生气,我认为这是一个有用的答案,关于工作/非工作版本的评论也很有帮助)BusyBox的某些版本(例如1.27.2)不支持Zip64,因此它只适用于小于4 GiB的成员文件。