ファイル名のいくつかのバージョンがあります。各ファイル名から最も高い番号のバージョンを選択する方法

ファイル名のいくつかのバージョンがあります。各ファイル名から最も高い番号のバージョンを選択する方法

ファイル名のいくつかのバージョンがあります。各ファイル名から最も高い番号のバージョンを選択する方法。

前任者:

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

おすすめ記事