Это скрипт 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
всегда являются целыми числами.