Назад | Перейти на главную страницу

Быстрый способ рекурсивного подсчета файлов в Linux

Я использую следующее, чтобы подсчитать количество файлов в каталоге и его подкаталогах:

find . -type f | wc -l

Но у меня там полмиллиона файлов, и подсчет занимает много времени.

Есть ли более быстрый способ подсчитать количество файлов, который не требует передачи огромного количества текста во что-то, что считает строки? Это кажется неэффективным.

Если у вас есть это в выделенной файловой системе или у вас есть постоянное количество дополнительных файлов, вы можете получить достаточно приблизительный подсчет количества файлов, посмотрев на количество inodes в файловой системе через " df -i ":

root@dhcp18:~# df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1            60489728   75885 60413843    1% /

В моем тестовом поле выше у меня выделено 75 885 инодов. Однако эти inodes - это не просто файлы, они также являются каталогами. Например:

root@dhcp18:~# mkdir /tmp/foo
root@dhcp18:~# df -i /tmp 
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1            60489728   75886 60413842    1% /
root@dhcp18:~# touch /tmp/bar
root@dhcp18:~# df -i /tmp
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1            60489728   75887 60413841    1% /

ПРИМЕЧАНИЕ. Не все файловые системы поддерживают подсчет inode одинаково. ext2 / 3/4 все будет работать, однако btrfs всегда сообщает 0.

Если вам нужно отличать файлы от каталогов, вам придется пройтись по файловой системе и "stat" каждый, чтобы увидеть, является ли это файлом, каталогом, символической ссылкой и т. Д. Самая большая проблема здесь не в конвейер всего текста в "wc", но поиск среди всех inodes и записей каталога, чтобы собрать эти данные вместе.

Кроме таблицы inode, показанной "df -i", на самом деле нет базы данных о том, сколько файлов находится в данном каталоге. Однако, если эта информация важна для вас, вы можете создать и поддерживать такую ​​базу данных, заставляя ваши программы увеличивать число при создании файла в этом каталоге и уменьшать его при удалении. Если вы не контролируете программы, которые их создают, это не вариант.

Если вы хотите рекурсивно подсчитать количество файлов в каталоге, найти Я знаю, что это самая быстрая команда, предполагающая, что у вас есть актуальная база данных (база данных sudo update .. выполняется по умолчанию через задание chron каждый день). Однако вы можете ускорить выполнение команды, если избегаете grep труба.

Видеть человек найти:

-c, --count
       Instead  of  writing  file  names on standard output, write the number of 
       matching entries only.

Итак, самая быстрая команда:

locate -c -r '/path/to/dir'

Я написал специальную программу для подсчета файлов для этого вопроса StackOverflow: https://stackoverflow.com/questions/1427032/fast-linux-file-count-for-a-large-number-of-files

Вы можете найти здесь репозиторий GitHub, если хотите просмотреть, загрузить или внести свой вклад: https://github.com/ChristopherSchultz/fast-file-count

Я бы также попробовал:

найти topDir -maxdepth 3 -printf '% h% f \ n'

А затем обработайте вывод, сведя к счету каталогов.

Это особенно полезно, если вы предвидите структуру каталогов.

если вы установили местоположение, вы можете использовать

locate -r '.' | grep -c "^$PWD"

или чтобы получить результат для всей файловой системы

locate -S

Это будет намного быстрее, чем найти, если у вас много файлов.

единственный недостаток, он также считает каталоги

Распараллеливайте это. Запустить отдельный find для каждого подкаталога и запускать их одновременно. Можно автоматизировать это, используя xargs.

Попробуйте этот удобный небольшой скрипт Python, чтобы узнать, работает ли он быстрее.

from os import walk
print sum([len(files) for (root, dirs, files) in walk('/some/path')])

Андрей