Эффективный способ добраться в последний раз изменил/создал файлы

У меня есть папка, которая имеет много файлов (различные журналы, сгенерированные веб-сайтом).

Управляемый для подсчета их с:

$ find . -maxdepth 1|wc -l
803313

Теперь я должен проверить журналы за прошедшие несколько дней. Получение последних 100 / 1000/... файлы так же хорошо. Проблемой является вышеупомянутая команда, занял приблизительно 5 секунд. Так, почти в 1 миллионе файлов, моем постоянном клиенте ls -lrt|tail -n 100 не опция.

Так, какие-либо идеи о том, как эффективно получить последние измененные файлы?

PS: Использование Ubuntu 12.04 LTS

1
задан 25 September 2014 в 15:54

2 ответа

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

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 (и больше) несколько дней назад.

4
ответ дан 10 November 2019 в 18:05

Можно использовать 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 файлов.

4
ответ дан 3 December 2019 в 06:22

Другие вопросы по тегам:

Похожие вопросы: