Geralmente, você não faria isso, pois a saída de ls
não é pós-processável de forma confiável.
Por exemplo:
open -- "$(ls -t | head -n 1)"
não funciona se o nome do arquivo mais novo contiver caracteres de nova linha.
Idealmente, você desejaria:
ls -zt | head -zn1 | xargs -r0 open --
Mas, infelizmente, não conheço nenhuma implementação de ls
que suporte a -z
/ -0
e os mantenedores do GNU ls
pelo menos declinou várias vezes para adicioná-lo .
Agora, existem outras maneiras com algumas implementações.
Com as implementações GNU e ast-open de ls
, na localidade C, a saída com a opção --quoting-style=shell-always
é pós-processável por zsh
, ksh93
ou bash
:
export LC_ALL=C
eval "files=($(ls --quoting-style=shell-always -t))"
open -- "${files[0]}" # $files[1] with zsh
Embora no zsh, você só faria
open ./*(om[1])
ou:
open ./Ctrl+Xm
como zsh
tem suporte embutido para ordenar arquivos por hora de modificação (e muitos outros critérios que vão muito além dos recursos ls
).
FreeBSD ls
tem uma opção --libxo
para gerar saída json ou xml, então você pode fazer:
ls --libxo=json -t | perl -MJSON::PP -0777 -l0 -ne '
print decode_json($_)
->{"file-information"}
->{directory}->[0]
->{entry}->[0]
->{name}' | xargs -r0 open --
Mas seria mais simples fazer a coisa toda em perl
.