curl .gz 文件并通过管道将其解压

sky*_*ork 15 bash gzip scripts pipe curl

我正在尝试从给定的 URL下载一些.gz文件(注意不是文件.tar.gz)并解压缩它们以覆盖现有文件(如果有)。

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

curl -O $URL | gunzip -f
Run Code Online (Sandbox Code Playgroud)

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

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

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

ste*_*ver 19

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

curl -O "$URL" && gunzip -f "${URL##*/}"
Run Code Online (Sandbox Code Playgroud)

如果你想使用管道,那么这样做的方法就像

curl "$URL" | gunzip -c
Run Code Online (Sandbox Code Playgroud)

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


Cla*_*ser 8

下载时遵循重定向。有时,出于安全和/或随机原因,Web 服务器会隐藏重定向。如果您不遵循重定向,则会下载错误的数据,并且您的应用程序读取管道数据会变得混乱。您可以使用 -L 标志通过 curl 跟踪重定向。

curl -L https://example.com/mygzip.tar.gz | tar zxv
Run Code Online (Sandbox Code Playgroud)