Uma observação sobre confiabilidade:
Como o caractere de nova linha é tão válido quanto qualquer outro no nome de arquivo, qualquer solução que dependa de linhas como o head
/tail
baseadas em é falha.
Com o GNU ls
, outra opção é usar a --quoting-style=shell-always
opção e uma bash
matriz:
eval "files=($(ls -t --quoting-style=shell-always))"
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
(adicione a -A
opção als
se você também quiser considerar arquivos ocultos).
Se você deseja limitar a arquivos regulares (desconsiderar diretórios, fifos, dispositivos, links simbólicos, sockets ...), você precisará recorrer ao GNU find
.
Com o bash 4.4 ou mais recente (para readarray -d
) e o GNU coreutils 8.25 ou mais recente (para cut -z
):
readarray -t -d '' files < <(
LC_ALL=C find . -maxdepth 1 -type f ! -name '.*' -printf '%T@/%f\0' |
sort -rzn | cut -zd/ -f2)
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
Ou recursivamente:
readarray -t -d '' files < <(
LC_ALL=C find . -name . -o -name '.*' -prune -o -type f -printf '%T@%p\0' |
sort -rzn | cut -zd/ -f2-)
O melhor aqui seria usar zsh
e seus qualificadores glob em vez de bash
evitar todo esse aborrecimento:
O arquivo regular mais recente no diretório atual:
printf '%s\n' *(.om[1])
Incluindo os ocultos:
printf '%s\n' *(D.om[1])
Segundo mais novo:
printf '%s\n' *(.om[2])
Verifique a idade do arquivo após a resolução do link simbólico:
printf '%s\n' *(-.om[1])
Recursivamente:
printf '%s\n' **/*(.om[1])
Além disso, com o sistema de conclusão ( compinit
e co) ativado, Ctrl+Xmtorna-se um complemento que se expande para o arquivo mais recente.
Assim:
vi Ctrl+Xm
Isso faria você editar o arquivo mais recente (você também terá a chance de ver qual arquivo antes de pressionar Return).
vi Alt+2Ctrl+Xm
Para o segundo arquivo mais recente.
vi * .cCtrl+Xm
para o c
arquivo mais recente .
vi * (.)Ctrl+Xm
para o arquivo regular mais recente (não diretório, nem fifo / dispositivo ...) e assim por diante.
watch -n1 'ls -Art | tail -n 1'
- mostra os últimos arquivos