バージョン番号が最も高いファイル名を選択してください。

バージョン番号が最も高いファイル名を選択してください。
highestVersion() {
    for TEST_PATH in `ls -a "$/TEMP"/*.flg`
    do
        echo " you are here"
        TEST_FILE=`basename "$TEST_PATH"`
        echo "$TEST_FILE"
    done
}

以下にファイルがありますTEST_FILE。この場合、たとえば「RMG」は、4つのバージョンを持つ本のタイトルです。このファイルセットから最新バージョンのファイルを選択して変数に保存するにはどうすればよいですか?変数にバージョン番号が最も高い一意のファイル名のみを含めるにはどうすればよいですか?

ABC_EFG_FLOOL_DR3GCTEU_19951223_HANSHAKE_V03.flg
ABC_EFG_FLOOL_DR3GCTPC_19951223_HANSHAKE_V03.flg
ABC_RFTY_PICK_AMTY_19951223_HANSHAKE_V03.flg
ABC_JANE_PICK_AMTY_19951223_HANSHAKE_V02.flg
ABC_XYZ_RMG_19951223_HANSHAKE_V01.flg
ABC_XYZ_RMG_19951223_HANSHAKE_V02.flg
ABC_XYZ_RMG_19951223_HANSHAKE_V03.flg
ABC_XYZ_RMG_19951223_HANSHAKE_V11.flg
ABC_XYZ_ALG0_19951223_HANSHAKE_V02.flg
ABC_XYZ_SGFXMM_19951223_HANSHAKE_V03.flg
ABC_XYZ_STRIP_FULLREVAL_YU_1234_19951223_HANSHAKE_V02.flg
ABC_XYZ_STRIP_FULLREVAL_YU_1234_19951223_HANSHAKE_V03.flg

答え1

バージョンの順序はあなたの語彙の順序と同じですので、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=\${$#}"

または、zsh次のバージョンまたは最新バージョンを使用してくださいbash

rmgs=(ABC_XYZ_RMG_19951223_HANSHAKE_V*.flg)
highest_version=${rmgs[-1]}

現在のディレクトリのすべてのファイルに対してこれを行うには(zsh最新バージョンbash(4.0以降)を使用):

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[@]}"
)

あなたのファイルには次のものがあります。

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

連想配列をサポートしていないシェルの場合は、次のツールを呼び出して同じことを実行できます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
)

答え2

私はそれが好きなperlので、悪い解決策を提案します。

#!/usr/bin/env perl
use strict;
use warnings;
my %highest_version_of;

for ( glob ( "*.flg" ) ) { 
    my ( $filename, $version ) = m/^(\w+)_V(\d+).flg/; 
    if ( $highest_version_of{$filename} //= 0 < $version ) { $highest_version_of{$filename} = $version }; 
}
foreach my $filename ( sort keys %highest_version_of ) {
    print "${filename}_$highest_version_of{$filename}.flg\n";
}

関連情報