Выберите имя файла с наивысшим номером версии

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 

2 Solutions collect form web for “Выберите имя файла с наивысшим номером версии”

Поскольку порядок версий совпадает с лексическим порядком в вашем случае с оболочкой 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 ) 

Мне нравится perl поэтому я предлагаю решение 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"; } 
  • Файловые дескрипторы и сценарии оболочки
  • Как я могу добавить префикс для ввода, который я получаю из канала через awk, и условно окрасить префикс?
  • Возможно ли иметь комментарии в многострочных командах в рыбе?
  • Установите переменные переменных переменных в bash (или другие)
  • проанализировать учетные данные из файла конфигурации PHP
  • Проверить IP-адрес в диапазоне белого списка
  • Как переименовать все файлы со специальными символами и пробелами в каталоге?
  • Выполнение функции bash из командной строки
  • Как найти файлы с тем же именем, но разные строки в двух каталогах?
  • Параметр одиночного кавычки сценария Bash с параметром globbing
  • сумма всех пакетов в файлах pcap
  • Linux и Unix - лучшая ОС в мире.