关于如何解压缩这样的管道 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
ZIP 文件格式包括存档末尾的目录(索引)。该目录说明每个文件在存档中的位置,因此允许快速、随机访问,而无需读取整个存档。
当尝试通过管道读取 ZIP 存档时,这似乎会造成问题,因为索引直到最后才被访问,因此在文件被完全读取并且不再可用之前无法正确提取单个成员. 因此,大多数 ZIP 解压缩器在通过管道提供存档时都会失败,这似乎不足为奇。
存档末尾的目录不是文件元信息存储在存档中的唯一位置。此外,出于冗余目的,各个条目还在本地文件头中包含此信息。
虽然不是每个 ZIP 解压缩器都会在索引不可用时使用本地文件头,但 libarchive(又名 bsdtar 和 bsdcpio)的 tar 和 cpio 前端在通过管道读取时可以并且将会这样做,这意味着以下是可能的:
wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | bsdtar -xvf- -C ~/Desktop
BusyBoxunzip
可以采用标准输入并提取所有文件。
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 -
.
只需使用 zcat
wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | zcat >> myfile.txt
虽然以下内容在 bash 中不起作用,但在 zsh 中将起作用。由于许多 zsh 用户可能会在这里结束,它可能仍然有用:
% unzip =( wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip )
Archive: /tmp/zshLCod6x
creating: akismet/
inflating: akismet/admin.php
inflating: akismet/akismet.css
inflating: akismet/akismet.gif
inflating: akismet/akismet.js
inflating: akismet/akismet.php
inflating: akismet/legacy.php
inflating: akismet/readme.txt
inflating: akismet/widget.php
%
如您所见,临时下载的 zip 文件已被立即删除:
% ls /tmp/zshLCod6x
ls: cannot access '/tmp/zshLCod6x': No such file or directory
%
wget -q -O tmp.zip http://downloads.wordpress.org/plugin/akismet.2.5.3.zip && unzip tmp.zip && rm tmp.zip
我会看看 funzip (http://www.info-zip.org/mans/funzip.html)。它的手册页指出,
...filter for extracting from a ZIP archive in a pipe
抱歉,我没有示例,但它看起来确实带有 Linux 解压缩实用程序。
转发我的答案:
I wrote a Python (2.x) script to do streaming extraction of ZIP archives, you can get it from here: https://raw.githubusercontent.com/pts/unzip_scan/master/unzip_scan.py . Usage: cat file.zip | sh unzip_scan.py -
.