我计划编写一个用于自动 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$'
更新:已经正确指出不需要调用wget
or :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 存在差异时才下载