Find

如何以遞歸方式獲取具有特定副檔名的最新文件列表並將它們複製到文件夾中

  • August 14, 2021

如何遞歸獲取帶有副檔名的最新文件列表.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

使用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

上面,它是sort -V(版本排序)以與 zsh 的nglob 限定符類似的方式對文件列表進行排序。

sort -n不起作用,因為它僅用於單獨排序數字。

引用自:https://unix.stackexchange.com/questions/664631