我有多个不同版本的文件名,如何从每个文件名中挑选出最高编号的版本?

问题描述 投票:0回答:1

我有多个不同版本的文件名,如何从每个文件名中挑选出最高编号的版本。

ganglia-3.7.2-2.el7.x86_64.rpm
ganglia-debuginfo-3.7.2-2.el7.x86_64.rpm
ganglia-devel-3.7.2-2.el7.x86_64.rpm
ganglia-gmetad-3.7.2-2.el7.x86_64.rpm
ganglia-gmond-3.7.2-2.el7.x86_64.rpm
ganglia-gmond-python-3.7.2-2.el7.x86_64.rpm
ganglia-web-3.7.1-2.el7.x86_64.rpm
ganglia-3.8.2-2.el7.x86_64.rpm
ganglia-debuginfo-3.8.2-2.el7.x86_64.rpm
ganglia-devel-3.8.2-2.el7.x86_64.rpm
ganglia-gmetad-3.8.2-2.el7.x86_64.rpm
ganglia-gmond-3.8.2-2.el7.x86_64.rpm
ganglia-gmond-python-3.8.2-2.el7.x86_64.rpm
ganglia-web-3.8.1-2.el7.x86_64.rpm\BMS-CEI2_BC-ADAP-19.04.1111-4_1.noarch.rpm
BMS-CEI2_BC-ADAP-19.04.1112-4_1.noarch.rpm
BMS-CEI2_BC-ADAP-20.04.1112-4_1.noarch.rpm
BMS-CEI2_BC-19.04.1111-4_1.noarch.rpm
BMS-CEI2_BC-19.04.1112-4_1.noarch.rpm
BMS-CEI2_BC-20.04.1112-4_1.noarch.rpm
glusterfs-cli-3.12.13-1.el9.x86_64.rpm
glusterfs-cli-3.12.13-1.el7.x86_64.rpm
glusterfs-cli-3.13.13-1.el7.x86_64.rpm

输出应该是:

ganglia-3.8.2-2.el7.x86_64.rpm
ganglia-debuginfo-3.8.2-2.el7.x86_64.rpm
ganglia-devel-3.8.2-2.el7.x86_64.rpm
ganglia-gmetad-3.8.2-2.el7.x86_64.rpm
ganglia-gmond-3.8.2-2.el7.x86_64.rpm
ganglia-gmond-python-3.8.2-2.el7.x86_64.rpm
ganglia-web-3.8.1-2.el7.x86_64.rpm
glusterfs-cli-3.13.13-1.el7.x86_64.rpm
BMS-CEI2_BC-20.04.1112-4_1.noarch.rpm
BMS-CEI2_BC-ADAP-20.04.1112-4_1.noarch.rpm

我通过一个方法,如采取前缀和使用 ls -v 命令来获取版本...比如

ganglia
ganglia-debuginfo
ganglia-dlevel
ganglia-web
.....

并使用 ls -v prefix* | tail -n 1 ..我可以得到完美的东西,但只有神经节前缀,我不能得到完美的东西......请帮助我。

我可以得到OP

glusterfs-cli-3.13.13-1.el7.x86_64.rpm
BMS-CEI2_BC-20.04.1112-4_1.noarch.rpm
BMS-CEI2_BC-ADAP-20.04.1112-4_1.noarch.rpm
ganglia-debuginfo-3.8.2-2.el7.x86_64.rpm
ganglia-devel-3.8.2-2.el7.x86_64.rpm
ganglia-gmetad-3.8.2-2.el7.x86_64.rpm
ganglia-gmond-3.8.2-2.el7.x86_64.rpm
ganglia-gmond-python-3.8.2-2.el7.x86_64.rpm
ganglia-web-3.8.1-2.el7.x86_64.rpm

我无法在OP中得到这个ganglia-3.8.2-2.el7.x86_64.rpm。

#!/bin/bash
ls -ltr *.rpm |awk '{print $9}' | sed '/^$/d' >> .ALLRPMNAMES.txt
# An associative array
declare -A names

# Iterate across the files, stripping version numbers and saving the name/prefix
for file in *.rpm
do
    name=${file%%-[0-9]*}    # Assume "-" and a non-zero digit marks the version
    ((names[$name]++))
done
echo " ${!names[@]}" >> RPMPREFIX.txt
sed -i 's/\s\+/\n/g' RPMPREFIX.txt
sed -i '/^$/d' RPMPREFIX.txt
while read line
do
ls -v $line* | tail -n 1 >> HighversionedRPMSALL.txt   
done < RPMPREFIX.txt
grep -Fxvf HighversionedRPMSALL.txt .ALLRPMNAMES.txt | grep -v 'k.sh' >> LowVersionedRPMS.txt
linux bash shell redhat
1个回答
0
投票

你可能已经知道了,获取包名列表的一个可能方法是。

list_of_prefixes=$(ls -v *.rpm | sed 's/-[0-9].*$//' | uniq)

这背后的假设是,连字符 - 的文件名中,后面的数字表示版本字符串的开始。

因此,为了只得到每个软件包的最后一个版本,你可以尝试一下。

for prefix in $list_of_prefixes; do 
  ls -rv $prefix-[0-9]* | head -n1
done

你会注意到,不是按升序排列文件,而是用命令取最后一个文件 tail我更倾向于用以下选项将文件按相反的顺序列出 -r 用命令取第一条。head -n1. 我觉得这样比较快。

演示一下。文件列表

$ ls
BMS-CEI2_BC-19.04.1111-4_1.noarch.rpm
BMS-CEI2_BC-19.04.1112-4_1.noarch.rpm
BMS-CEI2_BC-20.04.1112-4_1.noarch.rpm
BMS-CEI2_BC-ADAP-19.04.1112-4_1.noarch.rpm
BMS-CEI2_BC-ADAP-20.04.1112-4_1.noarch.rpm
ganglia-3.7.2-2.el7.x86_64.rpm
ganglia-3.8.2-2.el7.x86_64.rpm
ganglia-debuginfo-3.7.2-2.el7.x86_64.rpm
ganglia-debuginfo-3.8.2-2.el7.x86_64.rpm
ganglia-devel-3.7.2-2.el7.x86_64.rpm
ganglia-devel-3.8.2-2.el7.x86_64.rpm
ganglia-gmetad-3.7.2-2.el7.x86_64.rpm
ganglia-gmetad-3.8.2-2.el7.x86_64.rpm
ganglia-gmond-3.7.2-2.el7.x86_64.rpm
ganglia-gmond-3.8.2-2.el7.x86_64.rpm
ganglia-gmond-python-3.7.2-2.el7.x86_64.rpm
ganglia-gmond-python-3.8.2-2.el7.x86_64.rpm
ganglia-web-3.7.1-2.el7.x86_64.rpm
ganglia-web-3.8.1-2.el7.x86_64.rpm
glusterfs-cli-3.12.13-1.el7.x86_64.rpm
glusterfs-cli-3.12.13-1.el9.x86_64.rpm
glusterfs-cli-3.13.13-1.el7.x86_64.rpm

包的列表:

$ listofprefixes=$(ls -v | sed 's/-[0-9].*$//' | uniq)
$ echo "$listofprefixes"
BMS-CEI2_BC
BMS-CEI2_BC-ADAP
ganglia
ganglia-debuginfo
ganglia-devel
ganglia-gmetad
ganglia-gmond
ganglia-gmond-python
ganglia-web
glusterfs-cli 

每个包的最后一个版本列表

$ for p in $listofprefixes ; do ls -rv $p-[0-9]* | head -n1 ; done
BMS-CEI2_BC-20.04.1112-4_1.noarch.rpm
BMS-CEI2_BC-ADAP-20.04.1112-4_1.noarch.rpm
ganglia-3.8.2-2.el7.x86_64.rpm
ganglia-debuginfo-3.8.2-2.el7.x86_64.rpm
ganglia-devel-3.8.2-2.el7.x86_64.rpm
ganglia-gmetad-3.8.2-2.el7.x86_64.rpm
ganglia-gmond-3.8.2-2.el7.x86_64.rpm
ganglia-gmond-python-3.8.2-2.el7.x86_64.rpm
ganglia-web-3.8.1-2.el7.x86_64.rpm
glusterfs-cli-3.13.13-1.el7.x86_64.rpm

条目 ganglia-3.8.2-2.el7.x86_64.rpm 是存在的。

© www.soinside.com 2019 - 2024. All rights reserved.