Question

Je cherche un moyen rapide de trouver le nombre de fichiers dans un répertoire sur Linux.

Toute solution qui prend du temps linéaire dans le nombre de fichiers dans le répertoire n'est pas acceptable (par exemple "LS | WC -L" et des choses similaires) car il prendrait une durée de longue durée prohibite (il y a des dizaines ou peut-être des centainesde millions de fichiers dans le répertoire).

Je suis sûr que le nombre de fichiers dans le répertoire doit être stocké comme un numéro simple quelque part dans la structure du système de fichiers (peut-être peut-être?), dans le cadre de la structure de données utilisée pour stocker les entrées de répertoire - Comment puis-je arriver àce nombre?

Edit: Le système de fichiers est ext3.S'il n'y a pas de moyen portable de faire cela, je suis prêt à faire quelque chose de spécifique à EXT3.

Était-ce utile?

La solution

Pourquoi la structure de données devrait-elle contenir le numéro?Un arbre n'a pas besoin de connaître sa taille dans O (1), à moins que ce soit une exigence (et à condition que cela puisse nécessiter plus de verrouillage et éventuellement un goulot d'étranglement de la performance)

Par arbre, je ne veux pas dire, y compris SubDir Contents, mais les fichiers avec -maxdepth 1 - supposant qu'ils ne sont pas vraiment stockés comme une liste.

EDIT: EXT2 les stocka sous forme de liste liée.

Modern Ext3 implémente Hashed B-Trees

Ayant dit que / bin / ls fait beaucoup plus que compter et scanne réellement tous les inodes.Écrivez votre propre programme ou script en utilisant Opendir () et ReadDir ().

de ici :

#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;
}

Autres conseils

Vous pouvez utiliser Inotify pour suivre et enregistrer les fichiers Créer et dissuader les événements dans le répertoire surveillé.Il distribuerait le temps total requis pour maintenir le nombre de fichiers et vous permettre de récupérer instantanément le nombre de fichiers actuel.

L'inode pour le répertoire ne stocke pas le nombre de fichiers dedans, car généralement le nombre de fichiers n'est pas nécessaire séparément de la liste des noms du répertoire.Le compte de liaison de l'annuaire Inode donne indirectement le nombre de sous-répertoires (st_nlink est le nombre de sous-DirS plus deux).

Je pense que vous n'avez pas de choix sauf lire via toute la liste des fichiers du répertoire.trouver peut ou pourrait ne pas être plus rapide que LS.

Ceci est un exemple de pourquoi les grands répertoires sont un problème, même lorsque le répertoire est implémenté à l'aide d'un arbre B.

Il n'y a pas de moyen portable de faire cela.Les primitives de fichiers de bas niveau, c'est-à-dire ReadDir , travail comme si c'est une liste linéaire.Clairement, c'est une abstraction et certains systèmes de fichiers pourraient stocker un compte.Cependant, l'accès à celui-ci est intrinsèquement spécifique au système.

Si vous êtes prêt à passer à travers des cerceaux, vous pouvez avoir chaque répertoire dans un système de fichiers différent, utiliser des quotas et obtenir les informations avec la commande "REPQUOTA".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top