버전 번호가 가장 높은 파일 이름을 선택하세요.

버전 번호가 가장 높은 파일 이름을 선택하세요.
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";
}

관련 정보