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