Получить самый последний файл в каталоге в Linux - PullRequest
143 голосов
/ 19 июня 2009

Ищем команду, которая возвратит самый последний файл в каталоге.

Не видно предельного параметра для ls ...

Ответы [ 19 ]

211 голосов
/ 19 июня 2009
ls -Art | tail -n 1

Не очень элегантно, но работает.

120 голосов
/ 19 июня 2009
ls -t | head -n1

Эта команда фактически дает последний измененный файл в текущем рабочем каталоге.

61 голосов
/ 12 апреля 2014

Это рекурсивная версия (т. Е. Она находит последний обновленный файл в определенном каталоге или в любом его подкаталоге)

find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 2- | tail -n 1

Редактировать: используйте -f 2- вместо -f 2, как предложено Кевином

9 голосов
/ 29 апреля 2012

Я использую:

ls -ABrt1 --group-directories-first | tail -n1

Это дает мне только имя файла, исключая папки.

7 голосов
/ 19 июня 2009

ls -lAtr | tail -1

Другие решения не включают файлы, начинающиеся с '.'.

Эта команда также будет включать '.' и '..', что может быть, а может и не быть тем, что вы хотите:

ls -latr | tail -1

6 голосов
/ 07 сентября 2016

Сокращенный вариант, основанный на ответе dmckee:

ls -t | head -1
5 голосов
/ 17 августа 2016

Примечание о надежности:

Поскольку символ новой строки является таким же допустимым, как любой символ в имени файла, любое решение, основанное на строках , например, на основе 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 ...) и т. Д.

4 голосов
/ 13 марта 2015

Решение поиска / сортировки прекрасно работает до тех пор, пока количество файлов не станет действительно большим (как целая файловая система). Вместо этого используйте awk, чтобы просто отслеживать самый последний файл:

find $DIR -type f -printf "%T@ %p\n" | 
awk '
BEGIN { recent = 0; file = "" }
{
if ($1 > recent)
   {
   recent = $1;
   file = $0;
   }
}
END { print file; }' |
sed 's/^[0-9]*\.[0-9]* //'
3 голосов
/ 10 декабря 2013

Мне нравится echo *(om[1]) (zsh синтаксис), поскольку он просто дает имя файла и не вызывает никакой другой команды.

2 голосов
/ 01 февраля 2018

с использованием рекурсивной опции R .. вы можете рассмотреть это как улучшение для хороших ответов здесь

ls -arRtlh | tail -50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...