파일 이름의 여러 버전이 있습니다. 각 파일 이름에서 가장 높은 번호의 버전을 선택하는 방법

파일 이름의 여러 버전이 있습니다. 각 파일 이름에서 가장 높은 번호의 버전을 선택하는 방법

파일 이름의 여러 버전이 있습니다. 각 파일 이름에서 가장 높은 번호의 버전을 선택하는 방법.

전임자:

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

관련 정보