Was ist effizienter, ls oder ls -l?

7

Soweit ich weiß, lsruft der Befehl auf getdents, der bis zu x Verzeichniseinträge zurückgibt. Sind andere Systemaufrufe beteiligt? Wenn ich laufe ls -l, gibt es weitere Systemaufrufe? Ich versuche festzustellen, ob ls -les teurer und damit langsamer als ist ls.

user100503
quelle
3
Sie können die Systemaufrufe für jeden Befehl verwenden strace lsund strace ls -lanzeigen.
Timothy Martin
Ich habe die Strace auf einem Linux-System ausgeführt. Ich gehe davon aus, dass die Ergebnisse für ein Unix-System identisch sind.
user100503
1
Es spielt keine Rolle, was effizienter ist, da Effizienz nur bei der Automatisierung eine Rolle spielt und da lses nicht für die Automatisierung vorgesehen ist, gibt es immer effizientere und sicherere Möglichkeiten, das Dateisystem für Programmierzwecke zu beleuchten.
Kojiro

Antworten:

15

/bin/lssortiert normalerweise die Ausgabe. Ich bin mir nicht sicher, ob Ihre "effiziente" Frage nur über Systemaufrufe oder die gesamte geleistete Arbeit gestellt wird, /bin/ls -fwürde aber wahrscheinlich die geringste Arbeit leisten. Es werden nur die Dateinamen in Verzeichnisreihenfolge zurückgegeben. Keine Sortierung, keine zusätzlichen Inode-Lookups, um Metadaten zu erhalten (wie ls -les der Fall wäre).

Wenn Ihre Standardeinstellung " lsKolorieren" ist, entspricht dies möglicherweise ls -lohnehin dem Äquivalent, damit festgestellt werden kann, wie die Ausgabe gefärbt wird.

BowlOfRed
quelle
5
ls -lführt statfür jede einzelne Datei eine aus. Für jede Datei sind Inodes erforderlich, um Informationen wie Größe, Berechtigung oder Anzahl der festen Links zu erhalten.
pqnet
13

ls -list definitiv teurer, da das Dateisystem nach Metadaten wie Eigentümer, Gruppe, Berechtigungen, Zugriffszeit usw. abgefragt werden muss. Vanilla muss /bin/lsnur die Namen der Einträge in dem aufgelisteten Verzeichnis nachschlagen .

Beachten Sie, dass lsauf Ihrem System möglicherweise ein Alias ​​für etwas weniger Vanille als vorhanden ist /bin/ls. Laufen Sie, um type lszu sehen, ob dies der Fall ist.

dg99
quelle
Vanilla ls erhält die Inode-Nummern und muss dann die Verzeichnis- und Dateinamen von jedem Inode nachschlagen. Ist das richtig? ls -l muss dieselben Inodes wie oben erreichen, aber zusätzlich zum Dateinamen oder Verzeichnisnamen auch Metadaten von jedem Inode lesen. Ist das richtig?
user100503
Ja, aber abhängig von der Art des Dateisystems, der Konfiguration und den Verwendungsmustern kann das Nachschlagen von Metadaten teuer sein. Die Metadaten werden möglicherweise nicht mit den Inodes gespeichert - sie können auf einer anderen Partition oder sogar auf einer anderen Hardware vollständig gespeichert werden. (Wenn Sie jedoch einen Standard-Desktop verwenden, ist dies wahrscheinlich nicht der Fall.) Aus diesem Grund findverbringt die Manpage einige Zeit damit, über effiziente oder ineffiziente Suchvorgänge zu sprechen. Suchen, die nur Dateinamen betrachten, sind weitaus effizienter.
dg99
1
@ user100503: Ich bin mir ziemlich sicher, dass das Verzeichnis die Namen mit den Inode-Nummern enthält. Sie gehen nicht zum Inode, um den Namen zu erhalten (wenn Sie mehrere Hardlinks zu einer Datei haben, welcher der Dateinamen würde sich im Inode befinden?)
Celtschk
@ Celtschk Ja, ich denke meine Antwort war zu wortreich. Ich habe es bearbeitet, um die Verwirrung zu beseitigen.
dg99
2
@ user100503, nein ist es nicht. Die Daten im Verzeichnis können als Liste von Namen und den zugehörigen Inodes betrachtet werden. Das ist der Hauptzweck des Verzeichnisses. Der Name existiert nicht im Inode. Wie Celtschk erwähnt, haben mehrfach verknüpfte Inodes keinen einzigen Namen.
BowlOfRed