如何递归获取具有特定扩展名的最新文件列表并将它们复制到文件夹中

如何递归获取具有特定扩展名的最新文件列表并将它们复制到文件夹中

如何递归获取带有扩展名的最新文件列表.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.jmxTestPlan-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]从文件中获取目录)。

要按上次修改时间而不是按文件名的数字对文件进行排序,请将nglob 限定符替换为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不起作用,因为它只能单独对数字进行排序。

相关内容