卷曲.gz文件并将其通过管道进行解压缩


13

我正在尝试从给定的URL 下载一些.gz文件(不包括.tar.gz那些文件),并将其解压缩以覆盖现有文件(如果有)。

对于每个单独的下载,我尝试了以下操作:

curl -O $URL | gunzip -f

然而,这并没有工作,因为它与失败:gzip: stdin: unexpected end of file。我在bash shell脚本中运行了一系列此命令。

如果我将命令扩展到两个明确的步骤,即首先下载文件,然后解压缩.gz文件,则它可以工作。

为什么管道版本不起作用?


1
您确定curl -O实际上将文件流式传输到标准输出吗?也许您在想wget -O-什么?
钢铁司机

@steeldriver,您应该将其发布为答案curl | tar xz ...
Panther

也有--compressed,但这仅适用于压缩的响应。
kenorb 2015年

Answers:


18

管道(用|符号表示)将一个过程的标准输出发送到另一个过程的标准输入。在您的情况下,您似乎想使用命名文件,因此不适合使用管道-特别是,gunzip由于远程内容将进入本地文件,因此没有任何管道(因此会出现错误)。相反,您需要提取文件的名称(例如,从文件的URL中提取),例如(使用bash内置的字符串处理功能)

curl -O "$URL" && gunzip -f "${URL##*/}"

如果您要使用管道,那么执行该操作的方式将类似于

curl "$URL" | gunzip -c

(不带该-O选项),以便curl将远程内容流stdout传输到可以通过管道传输到的位置gunzip,但是随后您将需要重定向gunzip输出以适当覆盖目标未压缩文件。


6

下载时遵循重定向。有时出于安全和/或随机原因,Web服务器具有隐藏的重定向。如果您不遵循重定向,则会下载错误的数据,并且读取管道数据的应用程序会感到困惑。您可以使用-L标志使用curl进行重定向。

curl -L https://example.com/mygzip.tar.gz | tar zxv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.