web-dev-qa-db-fra.com

Combien de fichiers puis-je avoir sur un seul répertoire?

Cette question est liée à celui-ci .

Je travaille avec une animation qui génère beaucoup de fichiers (+/- 1 000 000) généralement stockés dans un seul répertoire. Sur Mac Os X, certains bogues ont généré plus de +/- 30 000 fichiers. J'ai donc divisé l'animation en plusieurs répertoires.

Sous Ubuntu, existe-t-il une limite au nombre de fichiers qu'un seul répertoire peut contenir?

21
H_7

Ubuntu ne limite pas la taille d'un répertoire, il est imposé par le système de fichiers. Chaque fichier et répertoire est un soi-disant inode. Vous pouvez utiliser df -i pour vérifier le nombre d'inodes utilisés et disponibles pour tous les systèmes de fichiers montés.

Je viens de créer 1 million et un fichiers sans problèmes, car la limite d'inode pour ma partition personnelle ext4 de 50 Go (46 Go) est suffisante.

J'ai utilisé l'extension Shell pour créer les fichiers, combiné à l'utilitaire touch:

mkdir test
cd test
touch {0..300000}
touch {300000..600000}
touch {600000..900000}
touch {900000..1000000}

Cela crée 100 0001 fichiers qui peuvent être vérifiés avec ls | wc -l. Pourquoi 300000..600000 et non 300001..600000? Parce que j'étais trop paresseux pour mettre ça à la fin.

df -i ressemble à:

/dev/sda6            3055616 1133635 1921981   38% /home

Maintenant, supprimez les fichiers de test (cd ..&&rm -f test a pris beaucoup plus de temps, utilisez donc rm avec les noms de fichiers):

rm {0..300000}
rm {300000..600000}
rm {600000..900000}
rm {900000..1000000}
cd ..
rmdir f

et le nombre d'inodes utilisés a diminué immédiatement après la suppression des fichiers:

/dev/sda6            3055616  133634 2921982    5% /home

Notez que même si le système de fichiers autorise un nombre de fichiers aussi important, il est horrible de stocker de tels fichiers dans un seul répertoire. Utilisez au moins des sous-répertoires avec une structure telle que f/i/l/e/filename.ext. Les programmes n'attendent souvent pas de telles quantités de fichiers.

32
Lekensteyn