用curl或者其他东西提取信息

用curl或者其他东西提取信息

我计划编写一个用于自动 VirtualBox 构建的脚本 我看到每个版本的 VirtualBox 都会放一个版本(当然)和一个发行版本。

在这个例子中

http://download.virtualbox.org/virtualbox/5.0.6/VirtualBox-5.0.6-103037-Linux_amd64.run

5.0.6 是版本,103037 是发布版本,可能是 git 修订版。

每个新版本,当然都有一个新的发布版本,是否可以在不知道发布版本的情况下提取,也许用curl之类的?

答案1

这非常干净,但依赖于lynx转储链接(而不是使用正则表达式或其他东西解析源 HTML):

wget -q "https://www.virtualbox.org/wiki/Linux_Downloads" -O - | lynx -stdin -dump -listonly | grep -Eo 'http.+amd64.run$'

最后一个grep正则表达式假设您需要 amd64 版本。

同样的事情curl

curl -s "https://www.virtualbox.org/wiki/Linux_Downloads" | lynx -stdin -dump -listonly | grep -Eo 'http.+amd64.run$'

更新:已经正确指出不需要调用wgetor :curl

lynx -dump -listonly "https://www.virtualbox.org/wiki/Linux_Downloads" | grep -Eo 'http.+amd64.run$'

答案2

仅使用 wget,不需要发布版本,只需要版本:

wget -e robots=off -nd -r --no-parent -A 'VirtualBox-5.0.6-*-Linux_amd64.run' http://download.virtualbox.org/virtualbox/5.0.6/

wget 支持递归模式下的全局匹配作为其接受模式的一部分,因此:

-r: 递归下载
--no-parent: 不要递归到..
-A 'VirtualBox-5.0.6-*-Linux_amd64.run': 使用 glob 的接受模式
-e robots=off: 不要下载 robots.txt
-nd: 不要在本地创建任何子目录

当然可以使用版本环境变量:

VER=5.0.6
wget -e robots=off -nd -r --no-parent -A "VirtualBox-${VER}-*-Linux_amd64.run" http://download.virtualbox.org/virtualbox/${VER}/

VER实际上可以从http://download.virtualbox.org/virtualbox/LATEST.TXT所以这变成:

VER=$(wget -O - http://download.virtualbox.org/virtualbox/LATEST.TXT)
wget -e robots=off -nd -r --no-parent -A "VirtualBox-${VER}-*-Linux_amd64.run" http://download.virtualbox.org/virtualbox/${VER}/

或者使用curl或lynx提取版本信息...

如果在 cron 脚本中使用,您可以将每天的 ver 等同于本地版本 env var(wget 到 NEWVER),并且仅当 NEWVER 与当前 VER 存在差异时才下载

相关内容