-
O caso simples. Se você sabe que seus nomes de arquivo são são (sem espaços, globbing caracteres, newlines etc), você pode apenas fazer:
cat $(ls -t | head -n1)
-
Para lidar com espaços e personagens globbing, apenas cite:
cat "$(ls -t | head -n1)"
-
Se os nomes dos seus arquivos forem arbitrários e você precisar fazer isso funcionar para qualquer nome do arquivo, incluindo aqueles com novas linhas no nome, use:
cat "$(stat --printf '%n/%Y
' * | sort -rz -t'/' -k 2 | head -z -n 1 | cut -d'/' -z -f 1 )"cat *(om[1])
Explicação
-
stat --printf '%n/%Y
: imprime o nome do arquivo e sua data de modificação ( em segundos desde a época ), separados por/
'
e depois um NUL (/
). Estou usandosort -rz -t'/' -k 2
/
e-z
porque eles são apenas dois caracteres não permitidos em um nome de arquivo / diretório. -
sort
: classifique no segundo campohead -z -n 1
-separated. O-z
fazcut -d'/' -z -f 1
ler dados delimitados por NUL. -
/
: mantenha apenas a primeira linha delimitada por NUL (-z
). -
cut
: imprime apenas o primeiro campozsh
-delimited, o nome do arquivo. Novamente, obash
faz com que~/.bashrc
lidem com dados delimitados por NUL.
-
-
Use
/dev/null
em vez de %code% como seu shell e apenas execute:alias cat_last='cat "$(stat --printf "%n/%Y
" * | sort -rz -t"/" -k 2 | head -z -n 1 | cut -d"/" -z -f 1 )" 2>/dev/null'cat $(ls -t | head -n1)
Você pode definir qualquer um deles (de preferência 3, pois é o mais robusto) como um alias, adicionando essa linha ao seu %code% :
cat "$(ls -t | head -n1)"
Eu adicionei o %code% porque no meu sistema o shell reclama sobre um byte NUL estar na entrada. Isso não bloqueia o comando e não há motivo para continuar vendo o erro.