我想下载并解压给定目录下的存档。到目前为止我是这样做的:
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
我想下载并解压存档在飞行中,无需写入tar.gz
磁盘。我认为通过管道输出wget
totar
并给出tar
目标是可能的,但实际上我不知道如何将各个部分组合在一起。
答案1
您可以通过告诉wget
将其有效负载输出到标准输出(使用 flag -O-
)并抑制其自己的输出(使用 flag -q
)来做到这一点:
wget -qO- your_link_here | tar xvz
指定目标目录:
wget -qO- your_link_here | tar xvz -C /target/directory
如果您碰巧有 GNU tar
,您还可以重命名输出目录:
wget -qO- your_link_here | tar --transform 's/^dbt2-0.37.50.3/dbt2/' -xvz
答案2
另一种选择是使用默认curl
写入:stdout
curl -s -L https://example.com/archive.tar.gz | tar xvz - -C /tmp
答案3
这个 oneliner 就做到了这一点:
tar xvzf -C /tmp/ < <(wget -q -O - http://foo.com/myfile.tar.gz)
简短说明:首先执行括号中的右侧(-q
告诉 wget 安静地执行,-O -
用于将输出写入 stdout)。
然后我们使用 Bash 中的进程替换运算符创建一个命名管道<(
来创建命名管道。通过这种方式,我们创建了一个临时文件描述符,然后使用文件重定向运算符将该描述符的内容定向到 tar <
。
答案4
一种处理重定向并可以提取tar.bz2
文件的衬垫。用于xz
提取 gzip 文件。
curl -L https://downloads.getmonero.org/cli/linux64 | tar xj