Como a ordem de versão é igual à ordem lexical no seu caso, com um shell POSIX:
set -- ABC_XYZ_RMG_19951223_HANSHAKE_V*.flg
# now $1, $2... contain the files from the lowest version to highest.
shift "$(($# - 1))"
highest_version=$1
# or without shift:
eval "highest_version=\${$#}"
Ou com zsh
ou versões recentes de bash
:
rmgs=(ABC_XYZ_RMG_19951223_HANSHAKE_V*.flg)
highest_version=${rmgs[-1]}
Para fazer isso com todos os arquivos no diretório atual (novamente com zsh
ou versões recentes de bash
(4.0 ou superior)):
highest_versions() (
cd -P -- "$TEMP" || exit
typeset -A a
for f in *V??.flg; do
a[${f%V??.flg}]=$f
done
printf '%s\n' "${a[@]}"
)
Em seus arquivos, isso dá:
ABC_XYZ_STRIP_FULLREVAL_YU_1234_19951223_HANSHAKE_V03.flg
ABC_XYZ_RMG_19951223_HANSHAKE_V11.flg
ABC_JANE_PICK_AMTY_19951223_HANSHAKE_V02.flg
ABC_XYZ_ALG0_19951223_HANSHAKE_V02.flg
ABC_XYZ_SGFXMM_19951223_HANSHAKE_V03.flg
ABC_RFTY_PICK_AMTY_19951223_HANSHAKE_V03.flg
ABC_EFG_FLOOL_DR3GCTEU_19951223_HANSHAKE_V03.flg
ABC_EFG_FLOOL_DR3GCTPC_19951223_HANSHAKE_V03.flg
Com shells que não suportam matrizes associativas, você pode fazer o mesmo invocando uma ferramenta que faz como awk
:
highest_versions() (
cd -P -- "$TEMP" || exit
awk 'BEGIN{
for (i = 1; i < ARGC; i++) {
key = val = ARGV[i]
sub(/V..\.flg/, "", key)
a[key] = val
}
for (i in a) print a[i]
exit}' *V??.flg
)