У меня есть несколько имен файлов с разными версиями. как выбрать версию с наибольшим номером из каждого имени файла

Я знаю, что это старо, но в настройках панели Cinnamon есть опция «Разрешить указателю проходить через края панелей» . Это отключено по умолчанию. Это может быть ваша проблема.

panel settings

Прошло некоторое время с тех пор, как я запускал 17.1, и мой снимок экрана сделан из 18.3, но я почти уверен, что эта опция все еще где-то там.

3
26.03.2020, 11:51
3 ответа

В вашем случае я бы сделал скрипт на 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]:

, учитывал бы две буквы, не лучший ответ, по общему признанию, но он работает. Этот скрипт должен находиться в интересующей папке, и вы можете запустить его из терминала с помощью:

python3 a.py
0
19.03.2021, 02:32

Вы можете сделать это с помощью инструментов 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
19.03.2021, 02:32

Это ужасно, но с вашим набором данных работает

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
19.03.2021, 02:32

Теги

Похожие вопросы