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

StackOverflow https://stackoverflow.com/questions/3283582

Вопрос

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

Любое решение, которое принимает линейное время в количестве файлов в каталоге, не является приемлемым (например, «Ls | WC -L» и подобные вещи), потому что это примет запрещенное длительное количество времени (есть десятки или, может быть,миллионов файлов в каталоге).

Я уверен, что количество файлов в каталоге должно быть сохранено как простое число где-то в структуре файловой системы (inode возможно?), как часть структуры данных, используемой для хранения записей каталога - как я могу добраться доЭто число?

Редактировать: файловая система EXT3.Если нет портативного способа сделать это, я готов сделать что-то конкретное для Ext3.

Это было полезно?

Решение

Почему структура данных должна содержать номер?Дерево не нужно знать его размер в O (1), если только это не требование (и предоставляет это, может потребоваться больше блокировки и, возможно, узкого места производительности)

на дереве, я не имею в виду, включая содержимое подбадира, но файлы с -maxdepth 1 - предположить, что они на самом деле не хранятся в виде списка ..

Редактировать: ext2 сохраняет их как связанный список.

Modern Ext3 Indurement Hashed B-деревья P >.

Сказав это, / bin / ls намного больше, чем подсчет, и фактически сканирует все inodes.Напишите свою собственную программу или сценарий, используя opendir () и readdir ().

from Здесь :

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int main()
{
        int count;
        struct DIR *d;
        if( (d = opendir(".")) != NULL)
        {
                for(count = 0;  readdir(d) != NULL; count++);
                closedir(d);
        }
        printf("\n %d", count);
        return 0;
}
.

Другие советы

Вы можете использовать INOTIFY, чтобы отслеживать и записывать файл создавать и разбить события в мониторизованном каталоге.Он будет распространять общее время, необходимое для поддержания подсчета файла и позволить вам мгновенно восстановить текущий счетчик файлов.

Индекс для каталога не хранит количество файлов в нем, поскольку обычно количество файла не требуется отдельно из списка имен в каталоге.Количество ссылок INode Directory не косвенно дает количество подкуроров (GeneracodicCodcode - это количество подразделения плюс два).

Я думаю, у вас нет выбора, кроме как прочитайте весь список файлов в каталоге.найти мощь или не может быть быстрее, чем ls.

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

Там нет портативного способа сделать это.Примитивы файлов низкого уровня, IE readdir , работают Как будто это линейный список.Очевидно, что это абстракция, а некоторые файловые системы могут хранить счет.Тем не менее, доступ к нему по своей природе является конкретной файловой системы.

Если вы готовы прыгать через обручи, у вас может быть каждый каталог в другой файловой системе, используйте квоты и получите информацию с командой «Repquota».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top