Я бы сделал это изначально в bash, используя цикл for
, а не find
.
Я, честно говоря, не могу вспомнить, дает ли bash какие-либо обещания о порядке обработки глобусов. Итак, используя указанную вами дату выборки, приведем однострочное сравнение файлов, используя [[
:
$ declare -A last=(); for a in *; do for b in $a/[0-9]*/; do [[ $b > $last[$a] ]] && last[$a]=$b; done; done; declare -p last
declare -A last=([bbb]="bbb/181105_0000/" [zzz]="zzz/181004_2355/" [aaa]="aaa/181012_1545/" )
Обратите внимание, что здесь ограничивающим паттерном является $a/[0-9]*/
, что достаточно для ваших данных выборки. Конечно, вы можете ограничить это по мере необходимости, используя классы символов и устраняя глобус.
Обратите также внимание, что конечный /
в этом шаблоне гарантирует, что вы будете сопоставлять только то, что является каталогами. Это поместит /
в конце каждого результата в массиве $last
. При необходимости вы можете выполнить постобработку:
$ for i in "${!last[@]}"; do last[$i]="${last[$i]%/}"; last[$i]="${last[$i]#*/}"; done
$ declare -p last
declare -A last=([bbb]="181105_0000" [zzz]="181004_2355" [aaa]="181012_1545" )
Для простоты чтения, здесь разделитель на несколько строк. :)
# Create an associative array. Requires bash 4+.
declare -A last=()
# Step through the top-level directories
for a in *; do
# Step through the second level directories
for b in "$a"/[0-9]*/; do
# Compare and record as required
[[ $b > $last[$a] ]] && last[$a]="$b"
done
done
# Print the result
declare -p last