Was ist die "Verzeichnisreihenfolge" von Dateien in einem Verzeichnis (verwendet von "ls -U")?


19

Laut der Manpage für ls ls -Ubedeutet dies:

sortiere nicht; Listeneinträge in Verzeichnisreihenfolge.

Was bedeutet "Verzeichnisreihenfolge" und wie wird sie bestimmt?

Der folgende Test (ausgeführt auf einem ext3-Dateisystem) zeigt, dass es nicht die Reihenfolge ist, in der die Dateien erstellt wurden:

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

Antworten:


14

Das hängt vom Dateisystem ab. Bei einigen Dateisystemen (darunter ext3) ist ein Verzeichnis eine Datei mit einem bekannten Format, und das 'd'-Bit ist in seinen Berechtigungen oder im Modus festgelegt. In diesem Fall kann es wichtig sein, wie lange die Dateinamen erstellt und gelöscht wurden. Der Kernel füllt den ersten Eintrag in der Verzeichnisdatei aus, der genug Platz hat, um den Namen der neuen Datei aufzunehmen. Weitere Informationen finden Sie unter http://e2fsprogs.sourceforge.net/ext2intro.html im Abschnitt "Physikalische Beschreibung".

Bei einigen anderen Dateisystemen, darunter Reiserfs, besteht ein Verzeichnis eigentlich nur aus einigen Einträgen in einem B + -Baum , die im Dateisystem nicht sichtbar sind. Die Ebene lseines Verzeichnisses in einem Reiserfs-Dateisystem ist also in lexikalischer Reihenfolge.


@ Bruce: Also, was ist der Inhalt dieser "Verzeichnis" -Datei genau?
Faheem Mitha

Traditionell etwas sehr Ähnliches wie struct dirent, das ich in /usr/include/bits/dirent.h auf einer RHEL-Box und auf einer Slackware 11.0-Box definiert finde. Beide Maschinen lehnen es ab, ein Verzeichnis direkt zu öffnen (). Ich weiß, dass ich früher Dinge wie "cat.> Dot.as.file" gemacht habe, um ein Verzeichnis in eine reguläre Datei zu konvertieren. Das letzte Mal, als ich das sicher gemacht habe, war Solaris 8, glaube ich. Im Grunde genommen enthält struct dirent einen Inode (eine Zahl), eine Datensatzlänge, eine Namenslänge und eine Zeichenfolge, die, wie ich mich erinnere, möglicherweise mit ASCII-Nul abgeschlossen ist oder nicht.
Bruce Ediger

@ Bruce: Ok. Und diese C-Struktur schafft es, alle Informationen über die darin enthaltenen Dateien und Unterverzeichnisse in diese Felder zu bekommen?
Faheem Mitha

Ein Verzeichnis in Dateisystemen wie ext2 oder BSD FFS oder dem ursprünglichen Unix-Dateisystem enthielt nur eine Liste von Inode-Nummern und entsprechenden Dateinamen. Wenn Sie "ls" ohne Argumente aufrufen, erhalten Sie eine Liste mit Dateinamen. Wenn Sie "ls -l" gewählt hätten, würde "ls" selbst jeden Dateinamen durch Ausführen eines stat (2) -Systemaufrufs nach dem Dateinamen suchen und aus der struct stat Berechtigungen, Größe, "Dateityp" usw. Abrufen Nein, eine Verzeichnisdatei enthält nicht alle Informationen, sondern nur eine Liste von Namen.
Bruce Ediger

2
ext2.sourceforge.net/2005-ols/paper-html/node3.html erklärt, dass die Funktion dir_index den Dateinamen und ein dateisystemspezifisches Geheimnis enthält. dump2efs fügt dir_index in die Dateisystem-Feature-Zeile ein, wenn das Feature aktiviert ist.
Martin Dorey

3

In der Tat gibt es keine bestimmte Reihenfolge zu erwarten. Es liegt an der Implementierung des Betriebssystems und des Dateisystems, die Einträge nach Belieben zu ordnen. Ein Ziel dieser Option ist es, eine schnellere Auflistung zu erreichen, was bei sehr großen Verzeichnissen ein wesentlicher Faktor sein kann.


Es gibt Scheduling / Caching-Algorithmen in den Kernel- und Dateisystemtreibern, die beeinflussen, wann genau Daten auf die Festplatte geschrieben werden. Dies dient der Leistungssteigerung. Aufgrund dieser Optimierung können Sie nicht genau sagen, wann Schreibvorgänge stattfinden werden. Außerdem können alte Inodes in Dateisystemen wiederverwendet werden, sodass neue Dateien in Verzeichnisbereichen angezeigt werden können, in denen sich alte Dateien befanden. Die Reihenfolge der Erstellung ist also nicht erforderlich.
LawrenceC

@ultrasawblade: Ich bin mir nicht sicher, warum du das als Kommentar zu meiner eigenen Antwort geschrieben hast, anstatt als Antwort von selbst oder was auch immer.
Juli

@ultrasawblade: Genau genommen hat "Wiederverwendung alter Inodes" nichts mit der Wiederverwendung alter Verzeichnis-Slots zu tun. Dies kann passieren, wenn alte Verzeichniseinträge nicht mehr verknüpft sind. Wenn es sich nur um harte Links handelt, muss dies nicht dazu führen, dass Inodes freigegeben werden.
G-Man sagt, dass Monica

2

In dieser Reihenfolge werden die Einträge intern im Dateisystem gespeichert. Dies variiert von Dateisystem zu Dateisystem. Zum Beispiel können die Entire in einer Art ausgeglichenem Baum gespeichert werden, wie zum Beispiel einem Rot-Schwarz-Baum . Es kann weitere Optimierungen für Verzeichnisse mit einer geringen Anzahl von Einträgen geben, oder um Hinzufügungen und Entfernungen effizient zu behandeln.


-1

Directory ist nur eine andere Datei, in der die Metadaten der tatsächlichen Dateien aufgelistet sind. "ls -U" listet nur die Einträge in der gleichen Reihenfolge in der Verzeichnisdatei auf.

Die Reihenfolge wird vom Betriebssystem und der Dateisystem-Implementierung bestimmt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.