Примечание о надежности:
Поскольку символ новой строки является таким же допустимым, как любой символ в имени файла, любое решение, основанное на строках , например, на основе 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
, если вы также хотите рассмотреть скрытые файлы).
Если вы хотите ограничить обычные файлы (не обращая внимания на каталоги, 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 + X m становится завершителем, который расширяется до самого нового файла.
Итак:
vi <kbd>Ctrl+X</kbd><kbd>m</kbd>
Заставит вас отредактировать новейший файл (у вас также будет возможность увидеть, какой именно файл, прежде чем нажать Return ).
vi <kbd>Alt+2</kbd><kbd>Ctrl+X</kbd><kbd>m</kbd>
Для второго новейшего файла.
vi *.c<kbd>Ctrl+X</kbd><kbd>m</kbd>
для новейшего c
файла.
vi *(.)<kbd>Ctrl+X</kbd><kbd>m</kbd>
для новейшего обычного файла (не каталога, не fifo / device ...) и т. Д.