Нередко мне приходится подсчитывать количество файлов в каталоге, иногда это исчисляется миллионами.
Есть ли лучший способ, чем просто перечислять и считать их find . | wc -l
? Есть ли какой-нибудь вызов файловой системы, который вы можете сделать в ext3 / 4, который требует меньше операций ввода-вывода?
linux
filesystems
find
ext4
MattPark
источник
источник
find -maxdepth 1
. Обратите внимание, что при текущем подходе вы будете дважды считать любое имя, которое содержит символ новой строки.Ответы:
Не фундаментальное ускорение, но хоть что-то :)
Вам действительно не нужно передавать список имен файлов, достаточно только новых строк. Этот вариант примерно на 15% быстрее в моем Ubuntu 12.04.3, когда каталоги кэшируются в ОЗУ. Кроме того, этот вариант будет корректно работать с именами файлов, содержащими переводы строк.
Интересно, что этот вариант выглядит немного медленнее, чем приведенный выше:
Особый случай - но очень быстро
Если каталог находится в собственной файловой системе, вы можете просто посчитать inode:
Если количество каталогов и файлов в других каталогах, отличных от подсчитанного, не сильно меняется, вы можете просто вычесть это известное число из текущего
df -i
результата. Таким образом, вы сможете очень быстро считать файлы и каталоги.источник
time find /usr/src/ -printf \\n | wc -l
, вы можете очистить кеши между запусками с помощьюsudo sync && sudo sysctl -w vm.drop_caches=3
-printf x
предназначается , чтобы быть такой же , как-printf '\0'
? Я не вижу упоминаний в документах.-printf
работает аналогичноprintf()
функции в C с основным отличием в том, что%
директивы имеют другое значение. Действие вызывается для каждого найденного файла. Это означает, что-printf x
будет печататься символx
для каждого найденного файла (попробуйте!) И-printf '\0'
печатать символ NULL (код ASCII 0) для каждого найденного файла.-printf '\0'
не имеет особого значения. Оба будут работать одинаково в примере сwc -c
этим ответом.Я написал ffcnt именно для этой цели. Он извлекает физическое смещение самих каталогов с помощью
fiemap
ioctl, а затем планирует обход каталогов в несколько последовательных проходов, чтобы уменьшить произвольный доступ. Получите ли вы на самом деле ускорение по сравнению с,find | wc
зависит от нескольких факторов:fiemap
ioctl, принесут наибольшую пользу(повторное) монтирование с использованием
relatime
или дажеnodiratime
может повысить скорость (для всех методов), когда в противном случае доступ может привести к обновлению метаданных.источник
Собственно, на моей системе (Arch Linux) эта команда
быстрее, чем все вышеперечисленное:
источник
/bin/ls: Argument list too long
если вы используете globbing, но опять же он может работать рекурсивно, как find также, так что, возможно, это то, что нужно учитывать, не используйте find, если не нужно.ls -A
перечислить только файлы в текущем каталоге, в то время какfind
без-maxdepth 1
аргументов произойдет рекурсивный поиск по всем подкаталогам.