Una nota sobre confiabilidad:
Dado que el carácter de nueva línea es tan válido como cualquier otro en un nombre de archivo, cualquier solución que se base en líneas como las head/ tailbasadas son defectuosas.
Con GNU ls, otra opción es usar la --quoting-style=shell-alwaysopción y una bashmatriz:
eval "files=($(ls -t --quoting-style=shell-always))"
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
(agregue la -Aopción lssi también desea considerar los archivos ocultos).
Si desea limitarse a archivos normales (ignorar directorios, fifos, dispositivos, enlaces simbólicos, sockets ...), deberá recurrir a GNU find.
Con bash 4.4 o posterior (para readarray -d) y GNU coreutils 8.25 o posterior (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]}"
O 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-)
Lo mejor aquí sería usar zshy sus calificadores globales en lugar de bashevitar toda esta molestia:
El archivo regular más nuevo en el directorio actual:
printf '%s\n' *(.om[1])
Incluidos los ocultos:
printf '%s\n' *(D.om[1])
Segundo más nuevo:
printf '%s\n' *(.om[2])
Verifique la antigüedad del archivo después de la resolución del enlace simbólico:
printf '%s\n' *(-.om[1])
Recursivamente:
printf '%s\n' **/*(.om[1])
Además, con el sistema de finalización ( compinity co) habilitado, se Ctrl+Xmconvierte en un completer que se expande al archivo más nuevo.
Entonces:
vi Ctrl+Xm
Te haría editar el archivo más nuevo (también tienes la oportunidad de verlo antes de presionar Return).
vi Alt+2Ctrl+Xm
Para el segundo archivo más nuevo.
vi * .cCtrl+Xm
para el carchivo más nuevo .
vi * (.)Ctrl+Xm
para el archivo regular más nuevo (no directorio, ni fifo / dispositivo ...), y así sucesivamente.
watch -n1 'ls -Art | tail -n 1'- muestra los últimos archivos