如何在不将存档保存到磁盘的情况下下载存档并提取它?

Ben*_*rel 93 shell tar pipe wget

我想下载并解压缩给定目录下的存档。到目前为止,这是我的做法:

wget http://downloads.mysql.com/source/dbt2-0.37.50.3.tar.gz
tar zxf dbt2-0.37.50.3.tar.gz
mv dbt2-0.37.50.3 dbt2
Run Code Online (Sandbox Code Playgroud)

我想即时下载和解压缩存档,而无需将其tar.gz写入磁盘。我认为通过管道输出wgettotar并给出tar目标是可能的,但实际上我不知道如何将这些部分放在一起。

Jos*_* R. 126

您可以通过告诉wget将其有效负载输出到 stdout(带有 flag -O-)并抑制其自己的输出(带有 flag -q)来实现:

wget -qO- your_link_here | tar xvz -
Run Code Online (Sandbox Code Playgroud)

要指定目标目录:

wget -qO- your_link_here | tar xvz - -C /target/directory
Run Code Online (Sandbox Code Playgroud)

更新

如果你碰巧有 GNU tar

wget -qO- your_link_here | tar --transform 's/^dbt2-0.37.50.3/dbt2/' -xvz
Run Code Online (Sandbox Code Playgroud)

应该允许您一步完成所有操作。

-q 安静的

-O - 输出到标准输出

  • `wget -qO- <url> | tar -xvz -C <目标文件夹>` 在 gnu tar 上工作。 (2认同)
  • 您不必指定标准输入“-”。 (2认同)

Zle*_*ni 26

另一种选择是curl默认使用which 写入标准输出:

curl -s some_url | tar xvz -C /tmp
Run Code Online (Sandbox Code Playgroud)

  • 使用“-L”更好地卷曲以跟随重定向 (4认同)
  • 我比其他人更喜欢你的选择,但是 ```curl -s some_url | tar xvz - -C /tmp``` (3认同)
  • 正如 [FiftiN](https://unix.stackexchange.com/users/342396/fiftin) 建议的那样 -> 例如查看存储库中的过滤文件列表,可以使用:`$ curl -L https://api.github .com/repos/repo_owner/repo_name/tarball | tar tvfz - -C /tmp --wildcards *.py` (3认同)

小智 12

这个oneliner可以解决问题:

tar xvzf -C /tmp/ < <(wget -q -O - http://foo.com/myfile.tar.gz)
Run Code Online (Sandbox Code Playgroud)

简短说明:括号中的右侧首先执行(-q告诉 wget 安静地执行,-O -用于将输出写入 stdout)。

然后我们使用 Bash 中的进程替换运算符<(创建一个命名管道来创建一个命名管道。通过这种方式,我们创建了一个临时文件描述符,然后使用<文件重定向运算符将该描述符的内容定向到 tar 。