2014-01-19 2 views
0

Я просто хочу получить количество файлов в каталоге (и всех вложенных подкаталогах) как можно быстрее.Самый быстрый способ подсчета файлов в иерархии каталогов

Я знаю, как это сделать, используя find в сочетании с wc -l и аналогичными методами, однако они чрезвычайно медленны и проходят через каждую запись файла в каждом каталоге и подсчитывают их таким образом.

Это самый быстрый способ, или есть альтернативы? Например; Мне не нужно находить определенные типы файлов, поэтому я в порядке с захватом символических ссылок, скрытых файлов и т. Д., Если я могу быстрее вычислить количество файлов, посчитав все без дальнейшей обработки.

ответ

0

Попробуйте этот сценарий в качестве альтернативы:

find . -type d -exec bash -c 'd="{}"; arr=($d/*); echo "$d:${#arr[@]}"' \; 

В моем быстром базовом тестировании он пришел быстрее, чем wc -l

1

Самого быстрый Митос является использование locate + wc или аналогичного. Это не может быть быстрее. Главное disatvantage метода, который он считает не фактическими файлами, а файлы, находящиеся в базе данных локации. И эта база данных может быть увеличена на 1 день.

Так что это зависит от вашей задачи: если она терпит задержки, я бы предпочел locate.

На моем сверхбыстрой SSD на базе машины:

$ time find /usr | wc -l 
156610 

real 0m0.158s 
user 0m0.076s 
sys  0m0.072s 

$ time locate /usr | wc -l 
156612 

real 0m0.079s 
user 0m0.068s 
sys  0m0.004s 

На нормальной машине разница будет гораздо гораздо больше.

Частота обновления базы данных местоположения зависит от конфигурации хоста. По умолчанию он обновляется каждый день (он делается с использованием cron). Но вы можете настроить систему так, чтобы скрипт запускался каждый час или даже очень быстро. Конечно, вы можете запускать его не периодически, а по требованию (Благодарю вас, Уильям Пурселл за подсказку).

+0

База данных может быть обновлена ​​так часто, как вам хочется, поэтому вы можете сделать максимальную неподвижность намного меньше 1 дня. –

+0

@WilliamPursell: Да, конечно, Уильям, я прекрасно понимаю, что если вам нужно обновлять базу данных чаще, чем работает 'find', этот метод уже не так хорош. –

+0

Я не критикую ваше решение и фактически дал вам +1. Но читатель может не знать, что частота прогонов может быть изменена. –

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