Find
如何以遞歸方式獲取具有特定副檔名的最新文件列表並將它們複製到文件夾中
如何遞歸獲取帶有副檔名的最新文件列表
.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
使用
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
上面,它是
sort -V
(版本排序)以與 zsh 的n
glob 限定符類似的方式對文件列表進行排序。
sort -n
不起作用,因為它僅用於單獨排序數字。