Was ist der Sinn von ls -f (oder warum hängt das?)

9

Ich habe ein Verzeichnis mit ungefähr 100.000 Dateien. ls -f hängt über eine Minute. Ich lief strace und fing sofort an, getdents zu sehen, so dass ls das Verzeichnis klar liest. Ich sehe auch viele Anrufe bei brk, so dass ls Dinge im Speicher eindeutig puffert. Ich habe ein einfaches Programm geschrieben, das readdir aufruft und Dateinamen ausgibt und sofort reagiert. Aber ls -f liefert keine Ausgabe. Was gibt? Ich dachte, der springende Punkt von -f ist, dass es ls dazu bringt, nichts weiter als readdir zu tun. Gibt es eine tragbare, zuverlässige Möglichkeit, den Inhalt eines Verzeichnisses aufzulisten? (Beachten Sie, dass dies ls von gnus Coreutils unter Linux ist.)

-BEARBEITEN-

Es gab einen Alias, aber "/ bin / ls -1f> / dev / null" dauert 8 bis 15 Sekunden, "/ bin / ls -1fx> / dev / null" dauert 4 bis 11 Sekunden, aber ein einfaches Programm das dauert nur readdir dauert .011 Sekunden. Was muss ich tun, damit die Gnus nicht saugen?

William Pursell
quelle

Antworten:

7

Es -fgeht darum, zu vermeiden, dass jeder Dateieintrag angegeben werden muss, und zu vermeiden, dass alle Dateien gelesen werden müssen, bevor sie angezeigt werden. Es ist eine "Meta" -Option, die nur andere Optionen deaktiviert.

Also, ja, es sollte das tun, was Sie erwarten. Ich kann nicht antworten, warum dies nicht der Fall ist, aber ich würde vermuten, dass Sie möglicherweise einen Shell-Alias ​​oder etwas anderes haben, das zusätzliche Optionen in den Befehl einfügt. Dies kann eine Funktion wieder aktivieren als -fdeaktivieren und als "spezifischer" betrachtet werden. Sie haben also Vorrang.

Daniel Pittman
quelle
2
Argghh. ls () {/ bin / ls -FB $ @; } Dumme Startskripte.
William Pursell
1
hmm. Ich habe die Funktion deaktiviert und sehe immer noch das gleiche Verhalten, auch wenn ich / bin / ls ausführe.
William Pursell
Do / bin / ls -f -1 (das ist minus eins, nicht minus ell). Das / bin / ls auf einer RHEL-Box Ich verwende aus irgendeinem Grund Dateinamen in Spalten.
Bruce Ediger
0

In coreutils 7.0 wurde eine Optimierung hinzugefügt (Commit 8d974b00fbbc2025de63e1e6d54827648fefa1c4):

2008-08-01  Kamil Dudka  <[email protected]>
    ls -U1 now uses constant memory
    When printing one name per line and not sorting, ls now uses
    constant memory per directory, no matter how many files are in
    the directory.
    * ls.c (print_dir): Print each file name immediately, when possible.
    * NEWS: Mention the improvement.

Die erste Erklärung, die mir einfällt, ist, dass Sie eine ältere Version von Coreutils ausführen. Sie müssen ein Upgrade durchführen.

Gilles 'SO - hör auf böse zu sein'
quelle