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