Быстрый способ рекурсивного подсчета файлов в Linux
Я использую следующее для подсчета количества файлов в каталоге и его подкаталогах:
find . -type f | wc -l
Но у меня там полмиллиона файлов, и подсчет занимает много времени.
Есть ли более быстрый способ подсчета количества файлов, который не включает в себя передачу большого количества текста к чему-то, что считает строки? Это кажется неэффективным способом делать вещи.
7 ответов
Если у вас есть это в выделенной файловой системе или у вас постоянное количество файлов, вы можете получить достаточно грубый подсчет количества файлов, посмотрев на число inode в файловой системе через "df -i":
root@dhcp18:~# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 60489728 75885 60413843 1% /
В моем тестовом окне выше выделено 75 885 inode. Однако эти inode- это не просто файлы, это каталоги. Например:
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% /
ПРИМЕЧАНИЕ. Не все файловые системы поддерживают подсчет индексов одинаково. ext2/3/4 все будет работать, однако btrfs всегда сообщает 0.
Если вам нужно отличить файлы от каталогов, вам придется пройтись по файловой системе и "stat", чтобы увидеть, является ли это файл, каталог, sym-ссылка и т. Д. Самая большая проблема здесь - это не передача всего текста в "wc", но поиск среди всех инодов и записей каталога для объединения этих данных.
Кроме таблицы inode, как показано "df -i", в действительности нет базы данных о том, сколько файлов находится в данном каталоге. Однако, если эта информация важна для вас, вы можете создать и поддерживать такую базу данных, если ваши программы увеличивают число при создании файла в этом каталоге и уменьшают его при удалении. Если вы не управляете программами, которые их создают, это не вариант.
Я написал специальную программу для подсчета файлов для этого вопроса StackOverflow: https://stackoverflow.com/questions/1427032/fast-linux-file-count-for-a-large-number-of-files
Вы можете найти репозиторий GitHub здесь, если вы хотите просмотреть, загрузить или внести свой вклад: https://github.com/ChristopherSchultz/fast-file-count
Если вы хотите рекурсивно подсчитать количество файлов в каталоге, команда locate является самой быстрой из тех, что я знаю, при условии, что у вас есть современная база данных (база данных sudo обновляется по умолчанию с помощью задания 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'
Распараллелить это. Запустить отдельный find
введите команду для каждого подкаталога и запустите их одновременно. Можно автоматизировать это с помощью xargs
,
Если вы установили locate, вы можете использовать
locate -r '.' | grep -c "^$PWD"
или получить результат для всей файловой системы
locate -S
Это будет намного быстрее, чем найти, если у вас есть много файлов.
Единственный недостаток, он также считает каталоги
Я бы тоже попробовал:
find topDir -maxdepth 3 -printf "%h %f\n"
А затем обработать вывод, уменьшив количество каталогов.
Это особенно полезно, если вы ожидаете структуру каталогов.
Попробуйте этот удобный маленький скрипт на Python, чтобы увидеть, будет ли он быстрее.
from os import walk
print sum([len(files) for (root, dirs, files) in walk('/some/path')])
Эндрю