ファイル名のいくつかのバージョンがあります。各ファイル名から最も高い番号のバージョンを選択する方法。
前任者:
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
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
答え1
POSIX以外のGNUツールおよび/または配列をサポートする他のシェルを使用してbash
これを行うことができます。
#!/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
a.pyと同様に、あなたの状況に応じてPythonスクリプトを作成します。
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