首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我有多个不同版本的文件名。如何从每个文件名中挑选编号最高的版本

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

Stack Overflow用户
提问于 2020-05-18 18:34:03
回答 1查看 51关注 0票数 0

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

代码语言:javascript
复制
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

输出应为:

代码语言:javascript
复制
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命令来获取版本……喜欢

代码语言:javascript
复制
ganglia
ganglia-debuginfo
ganglia-dlevel
ganglia-web
.....

并且使用ls -v prefix* | tail -n 1 ..,我可以得到完美的东西,但仅对于ganglia前缀,我不能获得完美的thing..please帮助我

我能拿到O/P

代码语言:javascript
复制
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

我无法在O/P中获取此ganglia-3.8.2-2.el7.x86_64.rpm

代码语言:javascript
复制
#!/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
EN

回答 1

Stack Overflow用户

发布于 2020-05-18 20:49:37

正如您可能已经了解到的,获取包名列表的一种可能方法是:

代码语言:javascript
复制
list_of_prefixes=$(ls -v *.rpm | sed 's/-[0-9].*$//' | uniq)

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

因此,要只获取每个包的最新版本,您可以尝试:

代码语言:javascript
复制
for prefix in $list_of_prefixes; do 
  ls -rv $prefix-[0-9]* | head -n1
done

您可能已经注意到,我不是以升序列出文件并使用命令tail获取最后一个文件,而是使用选项-r以相反的顺序列出文件,以便使用命令head -n1获取第一个文件。我认为这会更快。

演示:文件的列表:

代码语言:javascript
复制
$ 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

包列表:

代码语言:javascript
复制
$ 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 

每个包的最新版本列表:

代码语言:javascript
复制
$ 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61867620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档