Имя файла со сравнением версий в скрипте оболочки - PullRequest
0 голосов
/ 28 июня 2018

Предположим, у меня есть имена файлов, такие как abc-1.0.sh, xyz-1.0.sh, pqr-1.0.sh, abc-2.0.sh, abc-3.0.sh.

Я пытаюсь с концепцией массива, но не могу это сделать. Я хочу, чтобы имена файлов были только abc-3.0.sh, xyz-1.0.sh, pqr-1.0.sh . Как мне сделать это в .sh файле?

1 Ответ

0 голосов
/ 28 июня 2018

Это скрипт bash (требуется bash 4.3+), который делает примерно то, что вы хотите сделать:

filenames=( abc-1.0.sh xyz-1.0.sh abc-3.1.sh pqr-1.0.sh abc-2.0.sh abc-3.10.sh )

declare -A suffixes majors minors

for filename in "${filenames[@]}"; do
    stem=${filename%%-*}        # "abc-xx.yy.sh" --> "abc"
    suffix=${filename#*-}       # "abc-xx.yy.sh" --> "xx.yy.sh"

    # Figure out major and minor version from "$suffix"
    major=${suffix%%.*}         # "xx.yy.sh" --> "xx"
    minor=${suffix#*.}          # "xx.yy.sh" --> "yy.sh"
    minor=${minor%%.*}          # "yy.sh" --> "yy"

    if [ -z "${suffixes[$stem]}" ] ||
       [ "$major" -gt "${majors[$stem]}" ] ||
       ( [ "$major" -eq "${majors[$stem]}" ] &&
         [ "$minor" -gt "${minors[$stem]}" ] )
    then
        suffixes[$stem]=$suffix

        # Remember the largest parsed "xx.yy" for this stem
        majors[$stem]=$major
        minors[$stem]=$minor
    fi
done

for stem in "${!suffixes[@]}"; do
    printf '%s-%s\n' "$stem" "${suffixes[$stem]}"
done

Этот скрипт выводит

pqr-1.0.sh
xyz-1.0.sh
abc-3.10.sh

Он анализирует имена файлов и извлекает stem (бит до тире) и суффикс (бит после тире), затем извлекает основную и вспомогательную версию из суффикса. Затем он использует набор ассоциативных массивов suffixes, majors и minors, чтобы сравнить компоненты версии с ранее найденной последней версией для этого конкретного ствола. Если стебель ранее не был замечен или если версия видимого стебля была ниже, массивы обновляются в соответствии с информацией для этого стебля.

В конце выводятся консолидированные данные.

Ограничение в этом коде заключается в том, что имя файла всегда находится в форме

stem-xx.yy.something

и xx и yy всегда являются целыми числами.

...