拡張子を持つ最新のファイルのリストを再帰的にインポートし、.jmx
他のプロセスでファイル名を使用する方法は?
複数のフォルダで構成されたJMXファイルのリストがあり、各サブフォルダから最新のファイルを選択し、別のプロセスでJMXファイルを使用したいと思います。 (JMeterテストの実行)
理想的には、最新のファイルは、ファイル名に使用可能なバージョン番号が高いファイルでなければなりません。
2つのサブフォルダの例一覧
/test_plans/accounts/filter/TestPlan-API-Accounts-Filter-1.2.jmx
/test_plans/accounts/filter/TestPlan-API-Accounts-Filter-1.1.jmx
/test_plans/accounts/filter/TestPlan-API-Accounts-Filter-1.0.jmx
/test_plans/account-activation/TestPlan-Account-Activation-1.2.jmx
/test_plans/account-activation/TestPlan-Account-Activation-1.1.jmx
/test_plans/account-activation/TestPlan-Account-Activation-1.1 .jmx
/test_plans/account-activation/TestPlan-Account-Activation-1.0 .jmx
選ぶべきTestPlan-API-Accounts-Filter-1.2.jmx
ですTestPlan-Account-Activation-1.2.jmx
再帰的にファイルのリストをインポートできます。find ./test_plans -type f | sort -nr
答え1
これにより、zsh
次のことができます。
typeset -A latest
for jmx (**/*.jmx(nN)) latest[$jmx:h]=$jmx
値が名前が数字で最後にソートされたファイルである連想配列を$latest
構築します(このglobを有効にするglob修飾子のおかげで)。latest[some/dir]=some/dir/file-99.jwx
n
numericglobsort
次に、次のファイルに対していくつかのタスクを実行します。
ls -ld -- $latest
または、次のように繰り返します。
for file ($latest) {
...
}
または、必要に応じてBourneスタイルの構文を使用できます。
for file in $latest; do
...
done
連想配列のキー(ディレクトリ)を繰り返すには、次の手順を実行します。
for dir (${(k)latest}) ...
またはキーと値の両方:
for dir file (${(kv)latest}) ...
dir=$file:h
(常にファイルから親ディレクトリをインポートするか、ファイルからディレクトリをインポートすることはできますが$latest[$dir]
)
ファイル名に基づいて数値順ではなく最後の変更時刻に基づいてファイルをソートするには、n
glob修飾子をOm
。
bash
GNU 4.4+ および GNU とfind
同様の作業を行いますsort
。
typeset -A latest
readarray -td '' files < <(
LC_ALL=C find . -name '.?*' -prune -o -name '*.jmx' -print0 |
sort -zV)
for jmx in "${files[@]}"; do
latest[${jmx%/*}]=$jmx
done
それから:
ls -ld -- "${latest[@]}"
for file in "${latest[@]}"; do
...
done
for dir in "${!latest[@]}"; do
file=${latest[$dir]}
...
done
上記では、バージョンソートはzshのglob qualifierと同様の方法でsort -V
ファイルリストをソートします。n
sort -n
数字だけを並べ替えることができるので機能しません。