Примечание о надежности:
Поскольку символ перевода строки является таким же допустимым, как и любой в имени файла, любое решение, основанное на строках, подобных head
/ tail
based, имеет недостатки.
В GNU ls
другой вариант заключается в использовании --quoting-style=shell-always
параметра и bash
массива:
eval "files=($(ls -t --quoting-style=shell-always))"
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
(добавьте -A
опцию, ls
если вы также хотите рассмотреть скрытые файлы).
Если вы хотите ограничить обычные файлы (не обращая внимания на каталоги, fifo, устройства, символические ссылки, сокеты ...), вам нужно прибегнуть к 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'
- показывает самые последние файлы