我必须从此链接下载文件。下载的文件是一个zip文件,必须将其解压缩到当前文件夹中。

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

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


但是以这种方式,我需要执行两个命令,等待第一个命令完成才能执行下一个命令,而且,我必须知道文件temp.zip的名称才能将其赋予unzip。 br />
是否可以将wget的输出重定向到unzip?像

$ 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:不明确的重定向


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

评论

在后一个示例中,wget可能执行了两次,因为?是shell中的特殊字符。将网址放在“”中应该会有所帮助。

该线程似乎有解决方案。自己还没有尝试过。 serverfault.com/questions/26474/…

#1 楼

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


尚不支持从标准输入读取的档案
,但 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 "" -O $TMPFILE
unzip -d $PWD $TMPFILE
rm $TMPFILE


评论


wget file.zip &&解压缩file.zip与wget file.zip相同吗?解压缩file.zip还是优先于另一个?谢谢 :)

– jaggedsoft
16 Dec 3'在20:10



@NextLocal wget && unzip仅在wget成功后才会运行解压缩。 wget;无论如何,解压缩都会运行解压缩,可能指向不存在的文件。

–temoto
17-2-7在11:37



funzip是我一直在寻找的答案。 Terraform(出于某种原因)将二进制文件作为单个文件打包在zip存档中,因此这对我来说是完美的。

–阿斯范·卡兹
18年11月7日在22:52

#2 楼

这是我对类似问题的回答的转贴:

ZIP文件格式在归档文件的末尾包含目录(索引)。该目录说明了每个文件在档案中的位置,因此可以快速,随机地访问而无需读取整个档案。管道,因为直到最后才访问索引,因此只有在文件被完全读取并且不再可用之后,才能正确提取单个成员。因此,当通过管道提供归档文件时,大多数ZIP解压缩器仅会失败就显得不足为奇。

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

尽管当索引不可用时,并不是每个ZIP解压缩器都会使用本地文件头,但libarchive的tar和cpio前端(又名bsdtar和bsdcpio)可以并且在通过管道读取时也会这样做以下是可能的:

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


评论


太好了!我会注意到tar给我一些有关未压缩数据大小错误(预期为0)的警告,但文件本身似乎未损坏。猜测是由于缺少索引。

–Wyatt8740
18 Mar 17 '18 at 7:50

我这里有一个.zip文件,其中包含具有可执行权限的文件。当我下载并传送到bsdtar中时,exec位会被丢弃。当我下载到磁盘并用bsdtar提取或解压缩时,将尊重exec位。

– Golar Ramblar
18年5月4日在16:02

//,@GolarRamblar,没有找到原因吗?

– Nathan Basanese
18/09/27在19:16

@NathanBasanese:这是答案。简而言之:ZIP归档文件有两个地方存储此类信息,这可能是不一致的,并且取决于bsdtar文件是否打开是可查找的,它是否使用一个或另一个地方。

– Golar Ramblar
18/12/11在15:54

#3 楼

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

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


评论


我只是发现jar不保留文件权限。否则不错的把戏。

– phunehehe
16 Dec 25'在10:15

您无需提供文件参数,只需使用|罐子十五

– OneCricketeer
17年8月25日在15:55

我也被这个假设所困扰,无法将jar用作解压缩的替代品。不幸的是,jar无法恢复提取的文件的权限。

–被告
20 Mar 9 '20 at 13:22

只需使用|罐子x

– korakot
20年5月17日在1:50

jar处理UTF-8文件名要好得多。解压缩损坏的东西。

–马辛
20-10-12在5:35

#4 楼

我不认为您甚至都不想将wget的输出传递到unzip。
文件由位于文件末尾的中央目录来标识。就像人们想象的那样交织在一起。

#5 楼

我的回答的转贴:

BusyBox的unzip可以使用stdin并提取所有文件。输入。

你甚至可以

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | busybox unzip -


,但这只是unzip的多余。默认情况下为BusyBox(例如Alpine),只需运行unzip file.zip即可。

评论


除了@Saftever的答案(我不允许对此发表评论)之外,busybox可以运行,但由于冗余的lseek而导致版本低于1.27.0的版本无法使用,请参阅changelog busybox.net

– Andrzej Cichocki
20/12/13在16:43

#6 楼

正确的语法为:

$ unzip <(curl -sL https://www.winpcap.org/archive/1.0-docs.zip)


,但由于错误(Debian上的Info-ZIP)而无法正常工作:

lseek(3, 0, SEEK_SET)                   = -1 ESPIPE (Illegal seek)

Archive:  /dev/fd/63
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of /dev/fd/63 or
        /dev/fd/63.zip, and cannot find /dev/fd/63.ZIP, period.


或在BSD / OS X上:

Trying to read large file (> 2 GiB) without large file support


这是因为标准zip工具主要使用lseek功能来进行设置文件结尾处的偏移量,以读取其中央目录记录的末尾。它位于存档结构的末尾,需要读取文件列表(请参阅:Zip文件格式结构)。因此,该文件不能是FIFO,管道,终端设备或任何其他动态文件,因为lseek函数无法定位输入对象。

因此,您具有以下解决方法:


使用不同类型的压缩(例如tar.gz),
您必须使用两个单独的命令,
使用替代工具(如其他答案中所建议),
创建别名或功能以使用多个命令。


评论


我认为它仍然可以是FIFO。您只需要继续从FIFO读取直到EOF(有效地将整个FIFO缓冲在内存或临时文件中)即可。完全可以简化脚本创建,但不是很有用。

–埃文·卡洛尔(Evan Carroll)
16-10-9在20:28

#7 楼

如果zip中只有一个文件,则可以使用zcatgunzip

wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | gunzip


FYI:这是我系统上gunzipzcat的定义:

$ grep ^exec $(which gunzip zcat)
/bin/gunzip:exec gzip -d "$@"
/bin/zcat:exec gzip -cd "$@"


#8 楼

一个zip归档文件不是连续的,因为它通常在文件的末尾包含目录,因此很难对其进行流解压缩。文件格式,例如.tar.gz

例如,如果要从GitHub下载.zip文件,则几乎总是有可用的.tar.gz版本。

例如,
/>

https://github.com/madler/zlib/archive/v1.2.11.zip
https://github.com/madler/zlib/archive/v1.2.11 .tar.gz
https://github.com/curl/curl/archive/curl-7_68_0.zip
https://github.com/curl/curl/archive/curl-7_68_0.tar .gz

注意模式-只需将.zip替换为.tar.gz并通过管道连接到| tar xzf -

#9 楼

这对我很好:

 tar xvf <(curl -sL http://www.vim.org/scripts/download_script.php?src_id=11834)

jar xvf <(curl -sL http://www.vim.org/scripts/download_script.php?src_id=11834)

wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | tar xvf -

wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | jar xvf -