Selecione o nome do arquivo com o maior número de versão

1
highestVersion() {
    for TEST_PATH in 'ls -a "$/TEMP"/*.flg'
    do
        echo " you are here"
        TEST_FILE='basename "$TEST_PATH"'
        echo "$TEST_FILE"
    done
}

Abaixo está o arquivo TEST_FILE . Neste caso, por exemplo, "RMG" é um nome de livro com 4 versões. Como posso escolher o arquivo com a versão mais recente entre esses conjuntos de arquivos e armazená-lo em uma variável? Como posso iterar isso, para que, no final, a variável contenha apenas o nome do arquivo exclusivo com o maior número de versão?

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
    
por sunil kumar j n 22.12.2015 / 11:45

2 respostas

3

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
)
    
por 22.12.2015 / 11:54
0

Eu gosto de perl , então sugiro uma solução perlish:

#!/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";
}
    
por 22.12.2015 / 13:19