Se o seu problema é que o pedido é léxico, em vez de ser numérico, você pode usar zsh e fazer:
for dir in *(n/); do
tail -q -n 1 "$dir"/t1/regional_vol*.txt(n) | paste -s -d ',' -
done > data.csv
O qualificador n glob faz com que a classificação seja numérica.
Se usar zsh não for uma opção, mas seu ls for o GNU, uma alternativa é usar a opção ls do GNU -v para versão sort:
eval "dirs=($(ls -v --quoting-style=shell-always))"
for dir in "${dirs[@]}"; do
eval "files=($(
ls -vd --quoting-style=shell-always -- "$dir"/t1/regional_vol*.txt))"
tail -q -n 1 -- "${files[@]}" | paste -sd , -
done > data.csv
Sim, isso é analisando a saída de ls e usando eval no mesmo comando!
Mas aqui, é seguro, pois ls com --quoting-style=shell-always sai no formato exato esperado por eval .
Para adicionar seus cabeçalhos de linha e coluna:
{
eval "dirs=($(ls -v --quoting-style=shell-always))"
headers_done=false
for dir in "${dirs[@]}"; do
(
cd -- "$dir/t1" || exit
eval "files=($(
ls -vd --quoting-style=shell-always regional_vol*.txt))"
if ! "$headers_done"; then
printf DIR
printf ',%s' "${files[@]}"
printf '\n'
headers_done=true
fi
printf %s, "$dir"
tail -q -n 1 -- "${files[@]}" | paste -sd , -
)
done
} > data.csv