web-dev-qa-db-ja.com

異なるバージョンの複数のファイル名があります。すべてのファイル名から最も大きい番号のバージョンを選択する方法

異なるバージョンの複数のファイル名があります。すべてのファイル名から最も大きい番号のバージョンを選択する方法。

例:

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

O?P:

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
3
yugandhar

これは、GNUツール(POSIXではありません)と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を削除してください

1
roaima

これは恐ろしく感じますが、データセットで機能します

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
1
bu5hman

私は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]:

確かに最良の回答ではなく、2文字を考慮に入れますが、機能します。このスクリプトは対象のフォルダーに含まれている必要があり、次のコマンドを使用してターミナルから実行できます。

python3 a.py
0