curl .gz 文件并通过管道进行解压

curl .gz 文件并通过管道进行解压

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

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

curl -O $URL | gunzip -f

但是,这不起作用,因为它失败了:gzip: stdin: unexpected end of file。我在 bash shell 脚本中运行了一系列此命令。

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

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

答案1

管道(用|符号表示)发送标准输出一个过程标准输入另一个。 在您的例子中,您似乎想要使用命名文件,因此管道不合适 - 具体来说,没有什么可以管道(因此出现错误gunzip),因为远程内容将转到本地文件。 相反,您需要提取文件的名称 - 例如,从其 URL 中提取 - 类似于(使用 bash 的内置字符串操作功能)

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

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

curl "$URL" | gunzip -c

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

答案2

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

curl -L https://example.com/mygzip.tar.gz | tar zxv

答案3

下面做了三件事

    mkdir -p ${DIR} && curl -L http://apachemirror.wuchna.com/spark/spark-2.4.5/spark-2.4.5-bin-hadoop2.7.tgz | tar zxv -C ${DIR} --strip-components 1
  1. 强制创建目标目录
  2. 将档案解压到指定目录
  3. 通过简单地剥离档案的根目录,用给定的目录名替换根目录。

相关内容