有关如何解压缩管道 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 的 tar 和 cpio 前端(又名 bsdtar 和 bsdcpio)
可以并且将会在通过管道读取时这样做,这意味着以下情况是可能的:
wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | bsdtar -xvf- -C ~/Desktop
unzip
可以采用标准输入并提取所有文件。
wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | busybox unzip -
unzip
后面的破折号是使用stdin作为输入。
你甚至可以,
cat file.zip | busybox unzip -
但这只是多余的
unzip file.zip
。
如果您的发行版默认使用 BusyBox(例如 Alpine),只需运行
unzip -
。
wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | zcat >> myfile.txt
% 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
%
...filter for extracting from a ZIP archive in a pipe
抱歉,我没有示例,但看起来它确实附带了 Linux 解压缩实用程序。
: 我编写了一个Python(2.x)脚本来对ZIP档案进行流式提取,您可以从这里获取它:
https://raw.githubusercontent.com/pts/unzip_scan/master/unzip_scan.py。用法:cat file.zip | sh unzip_scan.py -
。
unzip
,您还应该有
funzip
,它来自同一个 [unzip] 包。该实用程序用于从管道/标准输入读取。然而,它看起来非常原始,并且显然只能从存档中提取第一个文件(根据手册页)。
无论如何,为了问题上下文的完整性,这是我发现的一种使用
funzip
进行单个文件
.zip
存档的方法:curl -sL https://<url_to_my_archive>.zip | funzip - > <my_extracted_file>
将
<url_to_my_archive>
和
<my_extracted_file>
替换为您的值。