Leitura em segundo plano: Por que meu script de shell sufoca em espaços em branco ou outros caracteres especiais? , Por que você não deve analisar a saída de ls
A definição de IFS
para uma nova linha significa que apenas novas linhas, e não espaços e tabulações, serão tratadas como separadores durante a expansão da substituição de comando. Seu método não suportará nomes de arquivos que contenham novas linhas; essa é uma limitação fundamental de ls
¹.
Além disso, e isso é o que você correu, definindo IFS
não tem efeito sobre a outra coisa que acontece na expansão de uma substituição de comando, que é globbing (correspondência de caractere curinga). Você pode desativar globbing e seu script funcionará, desde que os nomes dos arquivos não contenham novas linhas.
IFS='
'
set -- *"$IFS"*
if [ -e "$1" ]; then
echo >&2 "There are file names with newlines. I cannot cope with this."
exit 2
fi
set -f
for i in $(ls -1Atu); do
printf '%s\n' "$i"
done
set +f
unset IFS
A maneira fácil e confiável de enumerar arquivos por data é usar algo diferente de um shell estilo Bourne puro, como zsh que possui Qualificadores glob para modificar a maneira como as correspondências curinga são classificadas.
#!/bin/zsh
files_by_access_time=(*(Doa))
¹ Você pode contornar isso com algumas implementações de ls
, mas não se você precisar de portabilidade.