我有多个不同版本的文件名。如何从每个文件名中选择编号最高的版本。
前任:
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