Примітка про надійність:
Оскільки символ нового рядка є таким же дійсним, як і будь-яке ім'я файлу, будь-яке рішення, яке спирається на рядки, як head
/ tail
засновані, є помилковими.
Для GNU ls
інший варіант полягає у використанні --quoting-style=shell-always
параметра та bash
масиву:
eval "files=($(ls -t --quoting-style=shell-always))"
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
(додайте -A
параметр, ls
якщо ви також хочете розглянути приховані файли).
Якщо ви хочете обмежитися звичайними файлами (ігнорувати каталоги, фіфоси, пристрої, символьні посилання, сокети ...), вам потрібно буде вдатися до GNU find
.
З bash 4.4 або новішими (для readarray -d
) та GNU coreutils 8.25 або новішими (для 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]}"
Або рекурсивно:
readarray -t -d '' files < <(
LC_ALL=C find . -name . -o -name '.*' -prune -o -type f -printf '%T@%p\0' |
sort -rzn | cut -zd/ -f2-)
Найкраще тут буде використовувати zsh
та його глобальні класифікатори, а bash
не уникати всіх цих клопотів:
Найновіший звичайний файл у поточному каталозі:
printf '%s\n' *(.om[1])
У тому числі приховані:
printf '%s\n' *(D.om[1])
Другий останній:
printf '%s\n' *(.om[2])
Перевірка віку файлу після роздільної здатності символьної посилання:
printf '%s\n' *(-.om[1])
Рекурсивно:
printf '%s\n' **/*(.om[1])
Крім того, з compinit
увімкненою системою завершення ( і спільнотою) вона Ctrl+Xmстає комплектувачем, який розширюється до найновішого файлу.
Так:
vi Ctrl+Xm
Ви змусите редагувати найновіший файл (ви також отримаєте шанс побачити, який це файл, перш ніж натиснути Return).
vi Alt+2Ctrl+Xm
Для другого найновішого файлу.
vi * .cCtrl+Xm
для найновішого c
файлу.
vi * (.)Ctrl+Xm
для найновішого звичайного файлу (не каталогу, ні fifo / device ...) тощо.
watch -n1 'ls -Art | tail -n 1'
- показує останні останні файли