【问题标题】:find latest version of rpms from a mirror从镜像中查找最新版本的 rpm
【发布时间】:2009-12-10 02:05:01
【问题描述】:

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

该脚本应该能够在大多数 linux 版本(例如 centos、redhat、ubuntu)上运行。所以基于 yum 的解决方案不是一个选择。是否有任何现有的脚本可以做到这一点?或者有人可以给我一个大致的想法吗?

【问题讨论】:

    标签: shell rpm


    【解决方案1】:

    感谢 levislevis85 的 wget cli。试试这个:

    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
    tail - 只显示最后一个条目

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

    【讨论】:

    • 这不起作用,因为排序没有做正确的事情。请参阅我对丹尼斯威廉姆森的评论
    • 答案在我的帖子中,以提高可读性。希望对您有所帮助。
    • 我最终使用了您的初始解决方案。但是在排序时从名称版本中删除了 $ARCH.rpm。
    【解决方案2】:

    使用 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
    

    【讨论】:

    • 我为“wget -O- -q ” cli 投了票。我懒得阅读 wget 的手册页。
    【解决方案3】:

    试试这个(需要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,那么您将不得不从文件名中解析版本,或者希望常规排序会做正确的事情。

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

    【讨论】:

    • sort -V 好像有bug cat a | /build/toolchain/lin32/coreutils-8.2/bin/sort -V kernel-2.6.18-164.2.1.el5.x86_64.rpm kernel-2.6.18-164.6.1.el5.x86_64.rpm kernel-2.6。 18-164.el5.x86_64.rpm 结果应该是 kernel-2.6.18-164.el5.x86_64.rpm kernel-2.6.18-164.2.1.el5.x86_64.rpm kernel-2.6.18-164.6.1 .el5.x86_64.rpm
    • 它实际上并不理解版本号。它无法知道“el5”应该在“2.1.el5”之前。它知道的主要内容是,例如,“a10z”、“a1z”、“a2z”是 alpha 顺序,“a1z”、“a2z”、“a10z”是版本顺序。在这个例子中,“az”在任何一种情况下都会排在最后。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 2019-09-15
    • 2021-05-27
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多