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

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

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

前任:

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

奥普:

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

答案1

您可以使用 GNU 工具(不是 POSIX)和bash/或其他一些支持数组的 shell 来完成此操作

#!/bin/bash

# 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%%-[1-9]*}    # Assume "-" and a non-zero digit marks the version
    ((names[$name]++))
done
echo "Prefixes: ${!names[@]}"
echo

# Iterate across the prefixes looking for the highest numbered version
for name in "${!names[@]}"
do
    find -mindepth 1 -maxdepth 1 -name "${name}-[1-9]*.rpm" -printf "%f\0" |
        sort -z -rV |
        head -z -n1 |
        tr '\0' '\n'
done |
    sort

输出

Prefixes: BMS-CEI2_BC-ADAP glusterfs-cli BMS-CEI2_BC

BMS-CEI2_BC-20.04.1112-4_1.noarch.rpm
BMS-CEI2_BC-ADAP-20.04.1112-4_1.noarch.rpm
glusterfs-cli-3.13.13-1.el7.x86_64.rpm

如果您可以保证您的文件名不包含换行符,您可以find稍微简化该段:

    find -mindepth 1 -maxdepth 1 -name "${name}-*.rpm" -printf "%f\n" |
        sort -rV |
        head -n1

如果您不需要对名称集进行排序,请删除尾随的| sort

答案2

这感觉很糟糕,但它适用于你的数据集

sed -E "s/^(.+-)(([0-9]+\.){2}[0-9]+-.*)$/\1 \2/g" file1 | sort -r | awk '$1!=old{print $1$2; old=$1}'

拆分基本名称sed

sort相反,将更高版本的冒泡到顶部

awk找出每个基本名称的第一次出现,然后像您一样重新组装它们。

输出:

glusterfs-cli-3.13.13-1.el7.x86_64.rpm
BMS-CEI2_BC-ADAP-20.04.1112-4_1.noarch.rpm
BMS-CEI2_BC-20.04.1112-4_1.noarch.rpm

答案3

我会根据你的情况制作一个 python 脚本,类似于 a.py:

import os
import re
highestFile='a'
files = [f for f in sorted(os.listdir('.')) if os.path.isfile(f)]

for f in files:
    if highestFile[0]==f[0]: 
        if highestFile<f:
            highestFile=f
    else :
        print(highestFile)
        highestFile=f

例如,如果您的文件以不同的字母开头,则这将起作用,您可以修改第 5 行以添加更严格的标准,例如

if highestFile[1]==f[1] and highestFile[0]==f[0]:

,会考虑两个字母,诚然不是最好的答案,但它有效。该脚本应包含在感兴趣的文件夹中,您可以使用以下命令从终端运行它:

python3 a.py

相关内容