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

问题描述 投票:0回答:8

有关如何解压缩管道 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
bash wget unzip
8个回答
66
投票

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



25
投票
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 -

    


17
投票

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | zcat >> myfile.txt

这只会提取第一个文件。提取第一个文件后,您将看到此错误消息“gzip:stdin 有多个条目 - 忽略其余部分”。

15
投票

% 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 %



7
投票


5
投票

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

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


2
投票
我的回答

我编写了一个Python(2.x)脚本来对ZIP档案进行流式提取,您可以从这里获取它:

https://raw.githubusercontent.com/pts/unzip_scan/master/unzip_scan.py

。用法:cat file.zip | sh unzip_scan.py -

    


0
投票
unzip

,您还应该有

funzip
,它来自同一个 [unzip] 包。
该实用程序用于从管道/标准输入读取。然而,它看起来非常原始,并且显然只能从存档中提取第一个文件(根据手册页)。

无论如何,为了问题上下文的完整性,这是我发现的一种使用

funzip

进行单个文件

.zip
存档的方法:
curl -sL https://<url_to_my_archive>.zip | funzip - > <my_extracted_file>

<url_to_my_archive>

<my_extracted_file>
替换为您的值。
    

© www.soinside.com 2019 - 2024. All rights reserved.