Wie beschränke ich die Anzahl der von ls gedruckten Dateien?

89

Gibt es eine Möglichkeit, die Anzahl der auf einem lsBefehl aufgelisteten Dateien zu begrenzen ?

Ich habe gesehen:

ls | head -4

aber zu erhalten headoder tailausgeführt werden , ich brauche zu warten lsbis 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 lsBefehl ausführen , der begrenzt, ohne diesen headBefehl zu verwenden.

AndreDurao
quelle

Antworten:

109

Hast du es versucht

ls -U | head -4

Dadurch sollte die Sortierung übersprungen werden, weshalb dies wahrscheinlich lsso lange dauert.

https://stackoverflow.com/questions/40193/quick-ls-command

niko
quelle
"ls -U" liest immer noch das gesamte Verzeichnis vor dem Drucken ... Ich denke, dass ich ein kleines Skript schreiben werde, um die Dateien einzuschränken, aber dieser Fragenlink ist gutes Lesematerial. Danke niko
AndreDurao
5
@AndreDurao, GNU ls -Uliest nicht unbedingt das gesamte Verzeichnis, bevor es gedruckt wird. Versuchen Sie es beispielsweise strace -e getdents,write ls -U > /dev/nullin einem großen Verzeichnis.
Stéphane Chazelas
Nur eine Anmerkung: Wenn Sie strace unter OSX ausführen möchten, suchen Sie nach dtrace, der Befehl strace ist ein Linux-Dienstprogramm
AndreDurao
12

Wenn Ihre Version von lskeine Möglichkeit hat, Dateien zu sortieren, z. B. -Ufür GNU ls , verwenden Sie sie. Ohne Option lswerden 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.

find . -name . -o -prune | head

(Beachten Sie, dass headbei der Bearbeitung von Zeilen davon ausgegangen wird, dass Dateinamen keine Zeilenumbrüche enthalten).

Gilles
quelle
1
Beachten Sie, dass bei GNU find(im Gegensatz zu busybox oder heirloom oder findGNU ls -U) das gesamte Verzeichnis gelesen wird, bevor mit dem Drucken begonnen wird.
Stéphane Chazelas
4

Vielleicht sind Sie in der Suche nach einem anderen Tool als ls?

Randal Schwartz hat beispielsweise einen Blogeintrag über die Verwendung perlin 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 lsund findversuchen Sie, alle Verzeichniseinträge vor dem Drucken zu lesen, während die von perlihm vorgeschlagene Lösung dies nicht tut.

AFresh1
quelle
Ich dachte auch, dass dies die beste Option sein könnte, da sowohl ls als auch find das gesamte Verzeichnis vor dem Drucken lesen. Ich hatte vor, ein Rubinskript zu schreiben, um dies anstelle von Pearl zu tun, danke für AFresh1!
AndreDurao
1
@AndreDurao, verwendet perlwahrscheinlich readdir(3)like lsoder find. readdir(3)In aktuellen Versionen von GNU / Linux wird der getdents()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 anscheinend readdirBSDs getdirentries(3)oder den getdents(2)Systemaufruf umgehen und verwenden .
Stéphane Chazelas
3

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, mit zshkönnen Sie:

ls -ld -- *([1,4])

um die ersten 4 Dateien aufzulisten. zshDer gesamte Inhalt des Verzeichnisses wird trotzdem gelesen, auch wenn Sie anweisen, nicht zu sortieren *(oN[1,4])(beachten Sie, dass ls auch diese Liste sortiert wird).

Stéphane Chazelas
quelle
1

Vielleicht ist weniger besser für Ihre Bedürfnisse geeignet?

 ls /usr/bin | less

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 lessvorzeitig 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

 ls -R /usr | less 

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?

Benutzer unbekannt
quelle
Danke, aber ich habe nicht danach gesucht. Genau wie head wird less mit dem Ergebnis des gesamten lsErgebnisses ausgeführt. Ich suchte nach einer Möglichkeit, die Anzahl der Ergebnisse zu begrenzen.
AndreDurao
@AndreDurao: Verschob meine Kommentare in die Antwort.
Benutzer unbekannt
0
ls -lrth | tail

ls -lrth | tail -n 10

ls -lrth | grep *.gz | tail
Abhishek
quelle
Es tut mir leid, Abhishek, aber der Punkt dieser Frage ist, lsBefehl auf Bash zu nutzen. Piped Befehle wie grep, head, tailausgeführt oder andere nach demls
AndreDurao
0
$ cut -f 1,n filename

erledigt die Aufgabe des Abrufens der ersten nDateien. nDie Anzahl der zu extrahierenden Dateien. so vollständiger Code wird sein:

$ ls|cut -f 1,n file
Ramandeep Singh
quelle
1
Der von ls | cut -f 1,n fileIhnen vorgeschlagene Befehl würde das erste und n-te Feld in jeder Textzeile fileausgeben und die Ausgabe von vollständig ignorieren ls. Dies entspricht nicht den Anforderungen des Originalplakats.
TelcoM
Ja, Sie haben recht .nur eine Korrektur machen es ls | head -n ... Das wird sicher die Aufgabe erledigen.
Ramandeep Singh