РЕДАКТИРОВАТЬ: я думаю, что этот пост не "не особенно полезен", как я думал, что это было. Это действительно быстрое решение, которое просто отслеживает последний измененный файл (вместо сортировки всего списка файлов):
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 ' '
Конец РЕДАКТИРОВАНИЯ
Не очень полезный пост, но так как «аранжировка» обсуждала скорость, я решил поделиться этим.
Решения упорядочения и enzotib включают перечисление всех файлов в каталоге с их mtimes, а затем сортировку. Как известно, сортировка не нужна, чтобы найти максимум. Найти максимум можно за линейное время, но сортировка занимает n log (n) времени [я знаю, разница невелика, но все же;)]. Я не могу придумать изящный способ реализации этого. [РЕДАКТИРОВАТЬ: аккуратный (хотя грязный вид) и быстрая реализация, представленная выше.]
Следующая лучшая вещь - чтобы найти последний отредактированный файл в каталоге, рекурсивно найдите самый последний отредактированный файл в каждом подкаталоге уровня 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;
и попробовал еще раз. Это сработало - но заняло 1 минуту 35 секунд в моей домашней папке - решения аранжировки и энзотиба заняли 1,69 и 1,95 секунды соответственно!
Вот вам и превосходство O (n) над O (n log (n))! Черт возьми, функция вызова накладных расходов! [Или скорее сценарий вызова накладных расходов]
Но этот скрипт масштабируется лучше, чем предыдущие решения, и я уверен, что он будет работать быстрее, чем они в банке памяти Google; D