从镜子中找到最新版本的rpms

时间:2009-12-10 02:05:02

标签: shell rpm

我想编写一个脚本来查找镜像中可用的给定包的rpm的最新版本,例如:http://mirror.centos.org/centos/5/updates/x86_64/RPMS/

该脚本应该能够在大多数Linux风格上运行(例如centos,redhat,ubuntu)。因此,基于yum的解决方案不是一种选择。是否有任何现有脚本执行此操作?或者有人能给我一个关于如何解决这个问题的一般想法吗?

3 个答案:

答案 0 :(得分:1)

使用wget和gawk

#!/bin/bash
pkg="kernel-headers"
wget -O- -q http://mirror.centos.org/centos/5/updates/x86_64/RPMS | awk -vpkg="$pkg" 'BEGIN{
    RS="\n";FS="</a>"
    z=split("Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec",D,"|")
    for(i=1;i<=z;i++){
       date[D[i]]=sprintf("%02d",i)
    }
    temp=0
}
$1~pkg{
    p=$1
    t=$2
    gsub(/.*href=\042/,"",p)
    gsub(/\042>.*/,"",p)
    m=split(t,timestamp," ")
    n=split(timestamp[1],d,"-")
    q=split(timestamp[2],hm,":")
    datetime=d[3]date[d[2]]d[1]hm[1]hm[2]
    if ( datetime >= temp ){
        temp=datetime
        filepkg = p
    }
}
END{
    print "Latest package: "filepkg", date: ",temp
}'

以上的示例运行:

linux$ ./findlatest.sh
Latest package: kernel-headers-2.6.18-164.6.1.el5.x86_64.rpm, date:  200911041457

答案 1 :(得分:1)

对于wget cli来说,这是levislevis85。试试这个:

ARCH="i386"
PKG="pidgin-devel"
URL=http://mirror.centos.org/centos/5/updates/x86_64/RPMS
DL=`wget -O- -q $URL | sed -n 's/.*rpm.>\('$PKG'.*'$ARCH'.rpm\).*/\1/p' | sort | tail -1`
wget $URL/$DL

我会在此处发表评论,否则代码将无法读取。

试试这个:

ARCH="i386"
PKG="pidgin-devel"
URL=http://mirror.centos.org/centos/5/updates/x86_64/RPMS
DL=`wget -O- -q $URL | sed -n 's/.*rpm.>\('$PKG'.*'$ARCH'.rpm\).*<td align="right">\(.*\)-\(.*\)-\(.*\) \(..\):\(..\)  <\/td><td.*/\4 \3 \2 \5 \6 \1/p' | sort -k1n -k2M -k3n -k4n -k5n | cut -d ' ' -f 6 | tail -1`
wget $URL/$DL

它的作用是:
wget - 获取索引文件
sed - 切出一些零件并按不同顺序放在一起。应该导致年月日小时分钟和套餐,如:

2009 Oct 27 01 14 pidgin-devel-2.6.2-2.el5.i386.rpm
2009 Oct 30 10 49 pidgin-devel-2.6.3-2.el5.i386.rpm

排序 - 将列n保持为数字,将M保留为月份 削减 - 提出6 6 尾巴 - 仅显示最后一个条目

这个问题可能是,如果一个较旧的软件包版本在更新版本之后出现,那么这个脚本也会失败。如果站点的输出发生更改,则脚本将失败。脚本可能会失败的地方总是很多。

答案 2 :(得分:0)

试试这个(需要lynx):

lynx -dump -listonly -nonumbers http://mirror.centos.org/centos/5/updates/x86_64/RPMS/ |
    grep -E '^.*xen-libs.*i386.rpm$' |
    sort --version-sort |
    tail -n 1

如果您的sort没有--version-sort,那么您必须解析文件名中的版本,或者希望常规排序能做正确的事情。

您可以使用wget重定向,使用curl/dev/tcp/HOST/PORT或甚至Bash脚本执行类似的操作。这些问题是您必须parse HTML