如何尽可能紧凑地确定最新的稳定TuxOnIce版本

时间:2013-03-29 17:33:48

标签: bash sed grep cut tail

所以我打算在这里做的是从http://tuxonice.net/downloads/all/(目前tuxonice-for-linux-3.8.0-2013-02-24.patch.bz2)确定TuxOnIce的最新稳定版本。

使事情变得复杂的是没有“当前”链接,所以我们必须遵循版本控制,这类似于(这些不存在):

tuxonice-for-linux-3.8.0-2013-4-2.patch.bz2
tuxonice-for-linux-3.8-4-2013-4-16.patch.bz2
tuxonice-for-linux-3.8-11-2013-5-23.patch.bz2

问题是它们将按此顺序排列:

tuxonice-for-linux-3.8-11-2013-5-23.patch.bz2
tuxonice-for-linux-3.8-4-2013-4-16.patch.bz2
tuxonice-for-linux-3.8.0-2013-4-2.patch.bz2

我当前的实现(垃圾)就是这个。我想过使用日期但无法弄清楚如何做到(/tmp/tuxonice是索引文件):

_major=3.8 # Auto-generated
_TOI=$(grep ${_major}-1[0-9] /tmp/tuxonice | cut -d '"' -f2 | tail -1)
[ ! $_TOI ] && _TOI=$(grep ${_major}- /tmp/tuxonice | cut -d '"' -f2 | tail -1)
[ ! $_TOI ] && _TOI=$(grep ${_major}.0-2 /tmp/tuxonice | cut -d '"' -f2 | tail -1)

感谢。

2 个答案:

答案 0 :(得分:1)

使用网络服务器的功能按相反的顺序按修改日期对索引页面进行排序,使用lynx -dump抓取页面,获取与您感兴趣的文件名相匹配的第一行并打印相应的列。这为您提供了文件的绝对URL,您可以从那里调整命令,为您提供所需的确切输出(文件名,只是版本字符串,......)。

$ lynx -dump 'http://tuxonice.net/downloads/all/?C=M&O=D'|awk '/^[[:space:]]*[[:digit:]]+\..+\/tuxonice-for-linux/ { print $2; exit }'
http://tuxonice.net/downloads/all/tuxonice-for-linux-3.8.0-2013-02-24.patch.bz2

如果修改日期不是预期的话,仍然不会超级健壮,并且显然会破坏,你可能还想稍微调整一下正则表达式。

答案 1 :(得分:0)

这不是真正的答案,但我认为这个“单行”[1]非常酷:

HTML=$(wget -qO- http://tuxonice.net/downloads/all/ | grep tuxonice); TIMESTAMP=$(echo "$HTML" | sed 's/.*\([0-9]\{2\}-[A-Za-z]\{3\}-[0-9]\{4\} [0-9]\{2\}:[0-9]\{2\}\).*/\1/' | while read line; do echo $(date --date "$line" +%s) $line; done | sort | tail -n 1 | cut -d' ' -f2-3); LINK=$(echo "$HTML" | grep "$TIMESTAMP" | sed 's/.*href=\"\(.*\)\".*/\1/'); echo "http://tuxonice.net/downloads/all/${LINK}"

打印:

http://tuxonice.net/downloads/all/tuxonice-for-linux-3.8.0-2013-02-24.patch.bz2

这种方法实际上只是一个笑话。显然,有更好的方法可以使用支持XML解析的脚本语言。

至少,这可能会让您了解如何使用文件的日期/时间值来选择“最新”。但我要小心使用它(因为上传日期可能与版本号不一致),并建议你的版本号想法可能是一个更好的主意,如果你能以某种方式处理所有各种命名和版本编号方案,它看起来像他们已经用过。

[1]这不是一个真正的单线