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
输出以覆盖目标未压缩文件。
下载时遵循重定向。有时,出于安全和/或随机原因,Web 服务器会隐藏重定向。如果您不遵循重定向,则会下载错误的数据,并且您的应用程序读取管道数据会变得混乱。您可以使用 -L 标志通过 curl 跟踪重定向。
curl -L https://example.com/mygzip.tar.gz | tar zxv
Run Code Online (Sandbox Code Playgroud)