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
Не особливо корисна публікація, але оскільки "домовитись" обговорювали швидкість, я подумав, що поділюсь цим.
Рішення домовленостей та enzotib передбачають перерахування всіх файлів всередині каталогу з їх часом, а потім сортування. Як відомо, сортування не потрібно, щоб знайти максимум. Знайти максимум можна за лінійним часом, але сортування займає n log (n) часу [я знаю, різниця не велика, але все ж;)]. Я не можу придумати акуратний спосіб здійснення цього. [EDIT: акуратний (хоч і брудний вигляд) та швидке впровадження передбачено вище.]
Наступне найкраще - Щоб знайти останній редагований файл у каталозі, рекурсивно знайдіть останній редагований файл у кожному підкаталозі першого рівня. Нехай цей файл представляє підкаталог. Тепер сортуйте файли першого рівня разом із представниками підкаталогій рівня 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 знаходження запуску в іншій оболонці. Я спробував визначити 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 секунд - рішення аранжування та рішення Enzotib зайняли відповідно 1,69, 1,95 секунди!
Стільки за перевагу O (n) над O (n log (n))! Чорт ти функціонує накладні! [Точніше, накладні виклики сценарію]
Але цей сценарій масштабується краще, ніж попередні рішення, і я думаю, що він буде працювати швидше, ніж вони в банку пам'яті google; D