我有多个不同版本的文件名,如何从每个文件名中挑选出最高编号的版本。
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
你可能已经知道了,获取包名列表的一个可能方法是。
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
是存在的。