2012-04-20 2 views
4

У меня есть каталог с 8K файлами на данный момент. В течение следующего месяца или около того число увеличится до 100 тыс. Плюс. Мне нужно иметь возможность подсчитывать файлы в каталоге, соответствующем определенному шаблону. Матч шаблон добавляет огромное количество времени:Быстрый способ получить количество файлов, соответствующих шаблону

[[email protected] scripts]$ time ls | grep . -c 
8373 

real 0m0.115s 
user 0m0.109s 
sys 0m0.009s 
[[email protected] scripts]$ time ls *.o* | grep . -c 
6262 

real 0m1.997s 
user 0m0.121s 
sys 0m0.270s 

Поскольку количество файлов продолжает увеличивать время рассчитывать на шаблон станет слишком большим. Могу ли я обойти это?

В качестве побочного примечания файловая система Luster, и я могу иметь дело с непереносимым решением.

ответ

6

Возможно, что вас замедлило, так это то, что ваш глобус фактически расширен bash, а параметры передаются в ls, поэтому это немного дополнительная работа. Это работает для меня:

[email protected]:~/junk$ time find . | wc -l 
188318 

real 0m0.202s 
user 0m0.076s 
sys 0m0.136s 

[email protected]:~/junk$ time find . -name '*.o' | wc -l 
374 

real 0m0.243s 
user 0m0.160s 
sys 0m0.080s 

Не большая разница в скорости. Обратите внимание, что это рекурсивно, но вы можете установить maxdepth, если вы этого не хотите.

Возможно, пришло время для меня убрать какой-то мусор ...

+0

Отлично! Большое спасибо. – Sevenless

+0

Если файл имеет новую строку в своем имени, он может считаться двумя или более файлами. Я бы сделал это: 'найти. -maxdepth 1 -name '* .o' -printf "\ n" | wc -l'. (В этом случае '-name '* .o'' предотвращает' .' от подсчета, но в других случаях вам также может понадобиться '-mindepth 1', чтобы исключить' .'.) – musiphil

Смежные вопросы