特定の拡張子を持つ最新のファイルのリストを繰り返しインポートしてフォルダにコピーする方法

特定の拡張子を持つ最新のファイルのリストを繰り返しインポートしてフォルダにコピーする方法

拡張子を持つ最新のファイルのリストを再帰的にインポートし、.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.jwxnnumericglobsort

次に、次のファイルに対していくつかのタスクを実行します。

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]

ファイル名に基づいて数値順ではなく最後の変更時刻に基づいてファイルをソートするには、nglob修飾子をOm

bashGNU 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数字だけを並べ替えることができるので機能しません。

関連情報