Em zsh é tão fácil quanto
array=(*.sh(Nom))
O qualificador de glob om
faz com que as correspondências sejam classificadas por tempo de modificação (mais recente primeiro), e N
força a matriz a ficar vazia se não houver correspondência (em vez de causar um erro).
Em outros shells como o bash, não há uma boa maneira de classificar pelo tempo. Você pode usar ls -t
, mas isso pode ser interrompido porque a saída é ambígua. Se você sabe que seus nomes de arquivos contêm apenas caracteres que ls
considera imprimíveis e que não são espaços em branco ou \[*?
, você pode usar uma substituição de comando:
array=($(ls -t -- *.sh 2>/dev/null))
Você pode tornar isso mais robusto protegendo caracteres curinga e espaço em branco horizontal, mas novas linhas e caracteres não imprimíveis continuam sendo um problema.
IFS=$'\n'; set -f
array=($(ls -t -- *.sh 2>/dev/null))
unset IFS; set +f
Exceto em zsh, não se esqueça das aspas duplas ao se referir ao valor de uma variável, bem como --
para proteger arquivos cujo nome começa com um traço e seriam interpretados como opções, por exemplo rm -- "${array[0]}"