将流从 wget 传送到 tar 并将其提取到特定位置失败

将流从 wget 传送到 tar 并将其提取到特定位置失败

我尝试将流从 wget 传输到 tar 并将其提取到特定位置。
该文件由 wget 下载,但未根据需要使用 tar 解压:

war="/var/www/html"
domain="example.com"
downloaded_file="https://releases.wikimedia.org/mediawiki/1.33/mediawiki-1.33.0.tar.gz"
wget -P "${war}" "${downloaded_file}" | tar -xzvf ${downloaded_file} --transform="s,^${downloaded_file},${domain},"

set -x错误:

tar:无法识别的选项:
`--transform=s,^https://releases.wikimedia.org/mediawiki/1.33/mediawiki-1.33.0.tar.gz,example.com,'

为什么从 wget 到 tar 的流管道并将其提取到特定位置失败?

答案1

wget您可以组合这两个命令并通过指示写入文件的标准输出来跳过写入文件:

wget https://releases.wikimedia.org/mediawiki/1.33/mediawiki-1.33.0.tar.gz -O - |
tar -xzvf -

这将导致 的tar输出与 的进度指示器混合在一起wget,因为它将在下载时开始提取 tarball wget,因此您可能需要调整输出选项。

您可以使用tar-C选项来控制文件的提取位置:

wget https://releases.wikimedia.org/mediawiki/1.33/mediawiki-1.33.0.tar.gz -O - |
tar -xzvf - -C /var/www/html

目标目录需要在命令运行之前存在,因此mkdir如果需要的话首先要存在。

答案2

您将下载的数据写入文件,因此您实际上并未将任何内容通过管道传输到tar.仅当您希望一个程序的标准输出成为另一个程序的标准输入时,管道才有用。在这里,您正在下载一个文件,然后想用另一个工具打开它,因此管道没有用。

下一个问题是 your$downloaded_file实际上是一个 URL。因此,当您tar -xzvf ${downloaded_file}实际运行时tar -xzvf https://releases.wikimedia.org/mediawiki/1.33/mediawiki-1.33.0.tar.gz,将会失败,因为该文件不存在(它不是文件,而是互联网地址)。

你想做的是这样的:

war="/var/www/html"
targetUrl="https://releases.wikimedia.org/mediawiki/1.33/mediawiki-1.33.0.tar.gz"
fileName="${targetUrl##*/}"
wget "$targetUrl" -O "$war/$fileName" && 
    tar -xzvf "$war/$fileName"

我不明白为什么-P的选项wget在这里相关,也不明白为什么你需要 from --transformtar但如果你必须使用它,你可以这样做:

war="/var/www/html"
domain="example.com"
targetUrl="https://releases.wikimedia.org/mediawiki/1.33/mediawiki-1.33.0.tar.gz"
wget "$targetUrl" -O "$war/$fileName" && 
    tar -xzvf "$war/$fileName" --transform="s,^${targetUrl},${domain},"

我真的怀疑你是否想要这些。为什么会https://releases.wikimedia.org/mediawiki/1.33/mediawiki-1.33.0.tar.gz成为存档路径的一部分mediawiki-1.33.0.tar.gz

答案3

wget -qO - "https://releases.wikimedia.org/mediawiki/1.33/mediawiki-1.33.0.tar.gz" | tar -C /var/www/html zxvf -

相关内容