Quel est «l'ordre des répertoires» des fichiers dans un répertoire (utilisé par «ls -U»)?

19

Selon la page de manuel de ls, ls -Usignifie:

ne triez pas; liste les entrées dans l'ordre du répertoire.

Que signifie «ordre du répertoire» et comment est-il déterminé?

Le test suivant (exécuté sur un système de fichiers ext3), montre que ce n'est pas l'ordre dans lequel les fichiers ont été créés:

root@sv1010vm0007:/tmp# mkdir test
root@sv1010vm0007:/tmp# touch test/2
root@sv1010vm0007:/tmp# touch test/1
root@sv1010vm0007:/tmp# touch test/3
root@sv1010vm0007:/tmp# ls -U test
2  3  1
Stefan
la source

Réponses:

14

Cela dépend du système de fichiers. Pour certains systèmes de fichiers (ext3 parmi eux), un répertoire est en fait un fichier avec un format bien connu, et le bit «d» défini dans ses autorisations ou son mode. Dans ce cas, l'historique de la longueur des noms de fichiers créés et supprimés peut être important. Le noyau remplira la première entrée du fichier répertoire qui a suffisamment d'espace pour contenir le nom du nouveau fichier. Voir http://e2fsprogs.sourceforge.net/ext2intro.html pour plus de détails, la section intitulée "Description physique".

Pour certains autres systèmes de fichiers, dont Reiserfs, un répertoire est en fait juste quelques entrées dans une arborescence B + qui ne sont pas visibles dans le système de fichiers, donc une simple plaine lsde répertoire dans un système de fichiers Reiserfs est dans l'ordre lexical.

Bruce Ediger
la source
@Bruce: Alors, quel est exactement le contenu de ce fichier "répertoire"?
Faheem Mitha
Traditionnellement, quelque chose de très similaire à struct dirent, que je trouve défini dans /usr/include/bits/dirent.h sur une boîte RHEL et sur une boîte Slackware 11.0. Ces deux machines refusent d'ouvrir () directement un répertoire. Je sais que j'avais l'habitude de faire des choses comme "cat.> Dot.as.file" pour convertir un répertoire en fichier normal, la dernière fois que je l'ai fait à coup sûr était Solaris 8, je pense. Fondamentalement, struct dirent contient un inode (un nombre), une longueur d'enregistrement, une longueur de nom et une chaîne qui, si je me souviens bien, peut ou non se terminer par ASCII-Nul.
Bruce Ediger
@Bruce: Ok. Et cette structure C parvient à obtenir toutes les informations sur les fichiers et sous-répertoires qu'elle contient dans ces champs?
Faheem Mitha
Un répertoire dans des systèmes de fichiers comme ext2, ou BSD FFS ou le système de fichiers Unix d'origine, contenait juste une liste de numéros d'inode et de noms de fichiers correspondants. L'appel de "ls" sans arguments vous a juste valu une liste de noms de fichiers. Si vous avez fait "ls -l", "ls" lui-même rechercherait chaque nom de fichier en effectuant un appel système stat (2) sur le nom de fichier, et à partir de la stat stat, obtenez les autorisations, la taille, le "type de fichier", etc. Donc, non, un fichier de répertoire n'a pas toutes les informations, juste une liste de noms.
Bruce Ediger
2
ext2.sourceforge.net/2005-ols/paper-html/node3.html explique que la fonction dir_index hache le nom de fichier et un secret spécifique au système de fichiers. dump2efs inclut dir_index dans sa ligne de fonctionnalités du système de fichiers si la fonctionnalité est activée.
Martin Dorey
3

En effet, il n'y a pas d'ordre spécifique à attendre. C'est à l'implémentation du système d'exploitation et du système de fichiers de classer les entrées comme il le souhaite. L'un des objectifs de cette option est d'obtenir la liste la plus rapide possible, ce qui peut être un facteur important avec des répertoires très volumineux.

jlliagre
la source
Il existe des algorithmes de planification / mise en cache dans le noyau et les pilotes de système de fichiers qui influencent quand exactement les données sont écrites sur le disque. Ceci est fait pour augmenter les performances. En raison de cette optimisation, vous ne pouvez pas vraiment dire exactement quand les écritures auront lieu. De plus, les anciens inodes des systèmes de fichiers peuvent être réutilisés afin que de nouveaux fichiers puissent apparaître dans les emplacements de répertoire où se trouvaient les anciens fichiers. Ainsi, l'ordre de création n'est pas nécessaire "ordre du répertoire".
LawrenceC
@ultrasawblade: Je ne sais pas pourquoi vous avez écrit cela comme un commentaire à ma propre réponse au lieu d'une réponse seule ou autre.
jlliagre
@ultrasawblade: À strictement parler, "les anciens inodes [en cours de réutilisation]" n'ont rien à voir avec la réutilisation d'anciens emplacements de répertoire. Cela peut se produire lorsque les anciennes entrées du répertoire ne sont pas liées; s'ils sont tous des liens durs, cela ne doit pas nécessairement entraîner la désallocation des inodes.
G-Man dit «Réinstalle Monica»
2

C'est l'ordre dans lequel les entrées sont stockées en interne dans le système de fichiers. Cela variera d'un système de fichiers à un autre. Par exemple, les entrées peuvent être stockées dans une sorte d'arbre équilibré, tel qu'un arbre rouge-noir . Il peut y avoir d'autres optimisations pour les répertoires avec un petit nombre d'entrées, ou pour gérer efficacement les ajouts et les suppressions.

KeithB
la source
-1

Le répertoire est juste un autre fichier, qui répertorie les métadonnées des fichiers réels. "ls -U" répertorie simplement les entrées dans le même ordre dans le fichier de répertoire.

L'ordre est déterminé par le système d'exploitation et l'implémentation du système de fichiers.

rajaganesh87
la source