Shell 从镜像中查找RPM的最新版本

Shell 从镜像中查找RPM的最新版本,shell,rpm,Shell,Rpm,我想编写一个脚本,从镜像中查找给定包的rpm的最新版本,例如: 该脚本应该能够在大多数linux版本(如centos、redhat、ubuntu)上运行。因此,基于yum的解决方案不是一个选项。是否有任何现有脚本可以执行此操作?或者有人能给我一个大概的方法吗?试试这个(需要lynx): 如果您的排序没有--version sort,那么您必须从文件名中解析版本,或者希望常规排序可以做正确的事情 您可以使用wget或curl或甚至使用重定向/dev/tcp/HOST/PORT的Bash脚本执行类似

我想编写一个脚本,从镜像中查找给定包的rpm的最新版本,例如:

该脚本应该能够在大多数linux版本(如centos、redhat、ubuntu)上运行。因此,基于yum的解决方案不是一个选项。是否有任何现有脚本可以执行此操作?或者有人能给我一个大概的方法吗?

试试这个(需要
lynx
):

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

您可以使用
wget
curl
或甚至使用重定向
/dev/tcp/HOST/PORT
的Bash脚本执行类似的操作。问题是,您必须使用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
}'

wget cli的Thx至Levisle85。试试这个:

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\).*/\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
排序-将n列按数字排序,M列按月份排序
剪切-剪切文件6
尾部-仅显示最后一个条目


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

我给了您投票支持“wget-O--q”cli。我懒得阅读wget.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.rpmkernel-2.6.18-164.6.1.el5.x86_64.rpmIt实际上并不理解版本号。它无法知道“el5”应该在“2.1.el5”之前。它知道的主要事情是,例如,“a10z”,“a1z”,“a2z”是阿尔法顺序,“a1z”,“a2z”,“a10z”是版本顺序。在本例中,无论哪种情况,“az”都会在末尾进行排序。这不起作用,因为排序没有做正确的事情。见我对丹尼斯·威廉姆森的评论答案在我的帖子里,为了更好的可读性。希望有帮助。我最终使用了你最初的解决方案。但是在排序时,从名称版本中删除了$ARCH.rpm。
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
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