Как рекурсивно найти последний измененный файл в каталоге? - PullRequest
223 голосов
/ 30 декабря 2010

Кажется, что ls неправильно сортирует файлы при выполнении рекурсивного вызова:

ls -altR . | head -n 3

Как найти последний измененный файл в каталоге (включая подкаталоги)?

Ответы [ 19 ]

2 голосов
/ 05 августа 2014

Этот простой cli также будет работать:

ls -1t | head -1

Вы можете изменить -1 на количество файлов, которые вы хотите перечислить

2 голосов
/ 06 мая 2013

Это рекурсивно изменяет время изменения всех каталогов в текущем каталоге на самый новый файл в каждом каталоге:

for dir in */; do find $dir -type f -printf '%T@ "%p"\n' | sort -n | tail -1 | cut -f2- -d" " | xargs -I {} touch -r {} $dir; done
2 голосов
/ 10 октября 2012

Если запуск stat для каждого файла по отдельности означает замедление, вы можете использовать xargs, чтобы немного ускорить процесс:

find . -type f -print0 | xargs -0 stat -f "%m %N" | sort -n | tail -1 | cut -f2- -d" " 
1 голос
/ 23 ноября 2015

В Solaris работала следующая команда:

find . -name "*zip" -type f | xargs ls -ltr | tail -1 
1 голос
/ 07 июня 2017

Я считаю следующее короче и с более понятным выводом:

find . -type f -printf '%TF %TT %p\n' | sort | tail -1

Учитывая фиксированную длину стандартизованного формата даты-времени ISO, лексикографическая сортировка в порядке, и нам не нужна опция -n длясортировка.

Если вы хотите снова удалить временные метки, вы можете использовать:

find . -type f -printf '%TFT%TT %p\n' | sort | tail -1 | cut -f2- -d' '
1 голос
/ 17 декабря 2013

Мне показалась полезной приведенная выше команда, но в моем случае мне нужно было увидеть дату и время файла, а также возникла проблема с несколькими файлами, в именах которых есть пробелы. Вот мое рабочее решение.

find . -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" " | sed 's/.*/"&"/' | xargs ls -l
1 голос
/ 28 января 2017

Игнорирование скрытых файлов - с хорошей и быстрой отметкой времени

$ find . -type f -not -path '*/\.*' -printf '%TY.%Tm.%Td %THh%TM %Ta %p\n' |sort -nr |head -n 10

Результат

Хорошо обрабатывает пробелы в именах файлов - не то, чтобы их использовали!

2017.01.25 18h23 Wed ./indenting/Shifting blocks visually.mht
2016.12.11 12h33 Sun ./tabs/Converting tabs to spaces.mht
2016.12.02 01h46 Fri ./advocacy/2016.Vim or Emacs - Which text editor do you prefer?.mht
2016.11.09 17h05 Wed ./Word count - Vim Tips Wiki.mht

Подробнее

Подробнее find в изобилии по ссылке.

0 голосов
/ 09 августа 2016

Я написал пакет pypi / github для этого вопроса, потому что мне также требовалось решение.

https://github.com/bucknerns/logtail

Установка:

pip install logtail

Использование: tailsизмененные файлы

logtail <log dir> [<glob match: default=*.log>]

Использование2: Открытие последнего измененного файла в редакторе

editlatest <log dir> [<glob match: default=*.log>]
0 голосов
/ 11 февраля 2014

Я предпочитаю этот, он короче:

find . -type f -print0|xargs -0 ls -drt|tail -n 1
...