파일 이름의 여러 버전이 있습니다. 각 파일 이름에서 가장 높은 번호의 버전을 선택하는 방법.
전임자:
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