Gibt es eine Möglichkeit, die Anzahl der auf einem ls
Befehl aufgelisteten Dateien zu begrenzen ?
Ich habe gesehen:
ls | head -4
aber zu erhalten head
oder tail
ausgeführt werden , ich brauche zu warten ls
bis zum Ende der Ausführung, und mit Verzeichnissen mit einer enormen Menge von Dateien , die erhebliche Zeit in Anspruch nehmen kann.
Ich möchte einen ls
Befehl ausführen , der begrenzt, ohne diesen head
Befehl zu verwenden.
command-line
ls
limit
AndreDurao
quelle
quelle
ls -U
liest nicht unbedingt das gesamte Verzeichnis, bevor es gedruckt wird. Versuchen Sie es beispielsweisestrace -e getdents,write ls -U > /dev/null
in einem großen Verzeichnis.Wenn Ihre Version von
ls
keine Möglichkeit hat, Dateien zu sortieren, z. B.-U
für GNU ls , verwenden Sie sie. Ohne Optionls
werden zuerst alle Dateien gelesen, dann die Namen sortiert und dann der Druckvorgang gestartet.Eine andere Möglichkeit ist das Ausführen
find
, wobei die Namen so gedruckt werden, wie sie gefunden werden.(Beachten Sie, dass
head
bei der Bearbeitung von Zeilen davon ausgegangen wird, dass Dateinamen keine Zeilenumbrüche enthalten).quelle
find
(im Gegensatz zu busybox oder heirloom oderfind
GNUls -U
) das gesamte Verzeichnis gelesen wird, bevor mit dem Drucken begonnen wird.Vielleicht sind Sie in der Suche nach einem anderen Tool als
ls
?Randal Schwartz hat beispielsweise einen Blogeintrag über die Verwendung
perl
in großen Verzeichnissen , der einige Hinweise zum Erstellen von Elementen enthält, die Ihren Anforderungen entsprechen.In der Blog-Veröffentlichung erklärt Randal, dass beide
ls
undfind
versuchen Sie, alle Verzeichniseinträge vor dem Drucken zu lesen, während die vonperl
ihm vorgeschlagene Lösung dies nicht tut.quelle
perl
wahrscheinlichreaddir(3)
likels
oderfind
.readdir(3)
In aktuellen Versionen von GNU / Linux wird dergetdents()
Systemaufruf zumindest mit einer großen Anzahl aufgerufen (was die Leistung im Allgemeinen optimiert, indem die Anzahl der ausgeführten Systemaufrufe verringert wird). Wenn Sie jedoch weniger Dateien benötigen, müssen Sie anscheinendreaddir
BSDsgetdirentries(3)
oder dengetdents(2)
Systemaufruf umgehen und verwenden .Wenn es nicht um die Leistung geht (wie in der Frage, die als Duplikat dieser Frage geschlossen wurde) und Sie die ersten n Dateien (im Gegensatz zu den ersten n Zeilen der Ausgabe von
ls
) in der Liste der nicht versteckte Dateien sortiert nach Dateiname, mitzsh
können Sie:um die ersten 4 Dateien aufzulisten.
zsh
Der gesamte Inhalt des Verzeichnisses wird trotzdem gelesen, auch wenn Sie anweisen, nicht zu sortieren*(oN[1,4])
(beachten Sie, dassls
auch diese Liste sortiert wird).quelle
Vielleicht ist weniger besser für Ihre Bedürfnisse geeignet?
Für mich funktioniert es sofort auf einem 5 Jahre alten Laptop mit klassischer Festplatte, aber der Kopf ist genauso schnell.
Mit können Sie
less
vorzeitig kündigen q.Ich denke, Ihre Annahme über die Quelle der 1s Verzögerung ist falsch, hängt aber vielleicht von Ihrem Unix-Geschmack oder Ihrer Shell, less oder head-Befehl ab.
Unter Linux mit GNU-ls
fängt bei mir sofort an auszugeben, während die ganze ausgabe läuft und läuft - also definitiv nicht fertig, bevor weniger startet. Sie können überprüfen, ob Sie eine konstante Verzögerung von 1s oder mehr haben, abhängig von der Ausgabe oder nicht.
Ich denke, Ihre Verzögerung hat einen anderen Grund, vielleicht geht die Festplatte in den Ruhezustand und muss aufgeweckt werden?
Haben Sie eine solche Verzögerung auch für sehr wenige Dateien?
quelle
ls
Ergebnisses ausgeführt. Ich suchte nach einer Möglichkeit, die Anzahl der Ergebnisse zu begrenzen.quelle
ls
Befehl auf Bash zu nutzen. Piped Befehle wiegrep
,head
,tail
ausgeführt oder andere nach demls
erledigt die Aufgabe des Abrufens der ersten
n
Dateien.n
Die Anzahl der zu extrahierenden Dateien. so vollständiger Code wird sein:quelle
ls | cut -f 1,n file
Ihnen vorgeschlagene Befehl würde das erste und n-te Feld in jeder Textzeilefile
ausgeben und die Ausgabe von vollständig ignorierenls
. Dies entspricht nicht den Anforderungen des Originalplakats.