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";
}