如何将 wget 的输出重定向为解压缩的输入?

如何将 wget 的输出重定向为解压缩的输入?

我必须从这里下载一个文件关联。下载的文件是一个 zip 文件,我必须将其解压到当前文件夹中。

通常,我会先下载它,然后运行解压缩命令。

wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip
unzip temp.zip

但是这样,我需要执行两个命令,等待第一个命令完成才能执行下一个命令,而且我必须知道temp.zip要赋予它的文件名unzip

是否可以将输出重定向wgetunzip?就像是

unzip < `wget http://www.vim.org/scripts/download_script.php?src_id=11834`

但这没有用。

bash: `wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip`: ambiguous redirect

另外,wget被执行了两次,并下载了两次文件。

答案1

您必须将文件下载到临时文件,因为(引用解压缩手册页):

尚不支持从标准输入读取的存档,除了 funzip(然后只能提取存档的第一个成员)。

只需将命令组合在一起即可:

wget "http://www.vim.org/scripts/download_script.php?src_id=11834" -O temp.zip
unzip temp.zip
rm temp.zip

但为了使其更加灵活,您可能应该将其放入脚本中,以便节省一些输入,并且为了确保您不会意外覆盖某些内容,您可以使用该mktemp命令为临时文件创建一个安全的文件名:

#!/bin/bash
TMPFILE=`mktemp`
PWD=`pwd`
wget "$1" -O $TMPFILE
unzip -d $PWD $TMPFILE
rm $TMPFILE

答案2

这是转发的我的答案对于类似的问题:

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

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

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

尽管并非每个 ZIP 解压程序都会在索引不可用时使用本地文件头,但 tar 和 cpio 前端会指向 libarchive(又名 bsdtar 和 bsdcpio)能够并且将会在读取管道时执行此操作,这意味着可以执行以下操作:

wget -qO- http://example.org/file.zip | bsdtar -xvf-

答案3

如果安装了 JDK,则可以使用jar

wget -qO- http://example.org/file.zip | jar xvf /dev/stdin

答案4

我认为您甚至不想将 wget 的输出通过管道传输到 unzip 中。

来自维基百科“ZIP(文件格式)”文章:

ZIP 文件通过位于文件末尾的中心目录来标识。

wget 必须先完全完成下载,然后 unzip 才能执行任何工作,因此它们是按顺序运行的,而不是像人们想象的那样交织在一起。

相关内容