У меня есть папка, которая имеет много файлов (различные журналы, сгенерированные веб-сайтом).
Управляемый для подсчета их с:
$ find . -maxdepth 1|wc -l
803313
Теперь я должен проверить журналы за прошедшие несколько дней. Получение последних 100 / 1000/... файлы так же хорошо. Проблемой является вышеупомянутая команда, занял приблизительно 5 секунд. Так, почти в 1 миллионе файлов, моем постоянном клиенте ls -lrt|tail -n 100
не опция.
Так, какие-либо идеи о том, как эффективно получить последние измененные файлы?
PS: Использование Ubuntu 12.04 LTS
Окажитесь, может отфильтровать файлы в диапазоне времени. Вы сказали желание файлов, более новых, чем несколько дней назад:
find . -maxdepth 1 -ctime -3
Это найдет все файлы измененными за прошлые 3 дня.
можно использовать-ctime (изменения состояния файла),-mtime (изменения данных файла) и-atime (файл получил доступ к изменениям).
при необходимости в большем количестве гранулярности используйте-cmin,-mmin и - амин (которые используют минуты вместо дней).
диапазон времени может быть простым числом или использовать +/-знаки, следующим образом:
Numeric arguments can be specified as
+n for greater than n,
-n for less than n,
n for exactly n.
так -mtime -3
даст Вам, файлы изменили 3 дня (и меньше) назад. -mtime 3
даст Вам, файлы изменили 3 дня назад (обратите внимание, что дробные части отбрасываются, таким образом, это даст Вам файлы, измененные между 3 и 4 дня назад). -mtime +3
даст все файлы, измененные 3 (и больше) несколько дней назад.
Можно использовать printf для печати даты, %T@
дает Вам время изменения как метка времени Unix:
find . -type f -printf "%T@ %p\n" | sort -rn | head -n 10
На папке с 250 000 файлов требуется 10 секунд.
Заметка на полях: Для нахождения нового файла очень быстро можно использовать
find . -type f -printf "%T@\0%p\0" | gawk ' { if ($0>max) { max=$0; getline mostrecent } else getline } END{print mostrecent}' RS='\0'
Это занимает меньше чем 2 секунды на 250 000 файлов.