EDIT: Я думаю, этот пост не «не очень полезен», как я и думал. Это действительно быстрое решение, которое просто отслеживает последний измененный файл (вместо сортировки всего списка файлов):
find . -type f -printf '%T@ %p\n' | awk 'BEGIN { mostrecenttime = 0; mostrecentline = "nothing"; } { if ($1 > mostrecenttime) { mostrecenttime = $1; mostrecentline = $0; } } END { print mostrecentline; }' | cut -f2- -d ' '
Распространение на несколько строк для ясности он выглядит следующим образом:
find . -type f -printf '%T@ %p\n' | awk '
BEGIN { mostrecenttime = 0; mostrecentline = "nothing"; }
{
if ($1 > mostrecenttime)
{ mostrecenttime = $1; mostrecentline = $0; }
}
END { print mostrecentline; }' | cut -f2- -d ' '
Конец EDIT
Не особенно полезный пост, но так как «устраивать» обсуждали скорость, я думал, d).
Решения аранжировки и enzotib включают перечисление всех файлов внутри каталога с их mtimes, а затем сортировку. Как вы знаете, сортировка не нужна, чтобы найти максимум. Найти максимум можно в линейном времени, но сортировка занимает n log (n) time [Я знаю, что разница не много, но все же;)]. Я не могу придумать аккуратный способ реализации этого. [EDIT: опрятная (хотя и грязно выглядящая) и быстрая реализация, предусмотренная выше.]
Следующее лучшее - найти самый последний отредактированный файл в каталоге, рекурсивно найти последний отредактированный файл на каждом уровне 1 подкаталог. Пусть этот файл представляет собой подкаталог. Теперь отсортируйте файлы уровня 1 вместе с представителями подкаталогов уровня 1. Если число файлов и поддиректоров уровня 1 каждого каталога почти равно константе, то этот процесс должен масштабироваться линейно с общим количеством файлов.
Это то, что я придумал для реализации этого :
findrecent() { { find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1; }
findrecent .
Я запустил это и получил кучу ошибок find: findrecent: No such file or directory. Причина: -exec find работает в другой оболочке. Я попытался определить findrecent в .bashrc, .xsessionrc, но это не помогло [я буду признателен за помощь здесь]. В конце я прибегал к установке
#!/bin/bash
{ find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1;
в скрипте под названием findrecent в моем PATH и затем его запуске.
Я запускал это, продолжал ждать и ждать без вывода , Чтобы быть уверенным, что у меня не было никаких бесконечных циклов, я изменил файл на
#!/bin/bash
echo "$1" >&2
{ find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1;
и попытался снова.
Так много для превосходства O (n) по сравнению с O (n log (n)), но это заняло 1 минуту 35 секунд в моей домашней папке - решения arr и enzotib заняли 1,69, 1,95 секунды! )! Черт побери! [Или, скорее, накладные расходы на скрипт]
Но этот скрипт действительно масштабируется лучше, чем предыдущие, и я уверен, что он будет работать быстрее, чем в банке памяти Google, D