Быстрый способ узнать количество файлов в одном каталоге в Linux - PullRequest
3 голосов
/ 19 июля 2010

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

НЕДОПУСТИМО любое решение, которое требует линейного времени для количества файлов в каталоге (например, "ls |wc -l "и тому подобные вещи), потому что это заняло бы непомерно много времени (в каталоге находятся десятки или, возможно, сотни миллионов файлов).

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

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

Ответы [ 5 ]

6 голосов
/ 19 июля 2010

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

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

edit: ext2 хранит их как связанный список.

современные ext3 реализуют хэшированиеB-Trees

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

из здесь :

#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;
}
2 голосов
/ 20 июля 2010

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

1 голос
/ 19 июля 2010

Inode для каталога не хранит количество файлов в нем, так как обычно количество файлов не требуется отдельно от списка имен в каталоге. Счетчик ссылок на каталоги косвенно дает количество подкаталогов (st_nlink - это число подкаталогов плюс два).

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

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

0 голосов
/ 20 июля 2010

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

0 голосов
/ 19 июля 2010

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

...