如何递归获取带有扩展名的最新文件列表.jmx
并在另一个进程中使用文件名?
我有一个组织到不同文件夹中的 JMX 文件列表,想要选择每个子文件夹中的最新文件并在另一个进程中使用 JMX 文件。 (运行 JMeter 测试)
理想情况下,最新文件应该是文件名中可用版本号较高的文件。
两个子文件夹的示例列表
/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
关联数组,其中latest[some/dir]=some/dir/file-99.jwx
值是名称按数字排序最后的文件(感谢n
启用该 glob 的 glob 限定符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+find
和 GNU执行类似的操作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 限定符sort -V
类似的方式对文件列表进行排序。n
sort -n
不起作用,因为它只能单独对数字进行排序。