Gibt es eine Möglichkeit, ls
nur Verzeichnisse anstelle von Dateien und Verzeichnissen anzuzeigen?
Von der Manpage:
-d, --directory
list directory entries instead of contents, and do not derefer‐
ence symbolic links
Wenn ich es also in das /
Verzeichnis eingebe, werden voraussichtlich nur Verzeichnisse angezeigt. Stattdessen wird "." Angezeigt.
$ cd /
$ ls -d
.
Ich hatte erwartet ls -d
, mir das zu zeigen:
$ ls -d
bin data home opt sbin sys var
boot dev lib media proc selinux tmp
cdrom etc lost+found mnt root srv usr
Gibt es eine Möglichkeit, ls
nur Verzeichnisse anstelle von Dateien und Verzeichnissen anzuzeigen?
-d
bedeutet nicht, nur Verzeichnisse aufzulisten , sondern nicht, den Verzeichnisinhalt aufzulisten . Wennls */
Sie versuchen, etwas einzugeben, sehen Sie den Inhalt aller Verzeichnisse.ldir
michls -d */
in meinem verbündet,.bashrc
um dies einfacher zu machen ...Antworten:
Ihre Erwartungen basieren auf DOS Think / Windows Think und sind falsch. Unter MS-DOS, Windows und in der Tat einigen anderen IBM / Microsoft-Betriebssystemen wird die Platzhaltererweiterung vom Befehl selbst ausgeführt, und Dinge wie die
/a
Option zumdir
Befehl wirken als Attributfilter während der Platzhaltererweiterung.dir
Erweitert Platzhalter wie*
, die der Befehlsinterpreter unverändert weitergibt, und/a
wendet bei Angabe die entsprechenden Filter auf die zurückgegebenen Werte an. (Bei einigen Betriebssystemen können die Attributfilter dem Systemaufruf zum Auflisten eines Verzeichnisses zugewiesen werden, und der Betriebssystemkernel oder seine Dateisystemtreiber wenden sie selbst an.)Unter Unices und Linux wird die Platzhaltererweiterung von der Shell ausgeführt, und Berechtigungen werden nicht berücksichtigt. Wenn Sie dies im Stammverzeichnis tun
was der
ls
Befehl selbst von der Shell erhält, ist (so etwas wie)Mit der Option
-d
/--directory
wird deaktiviert, was normalerweise als Nächstes passiert . Was normalerweise als nächstes passiert, ist, dassls
jedes Argument der Reihe nach überprüft wird, dass es sich um Verzeichnisse handelt, und entschieden wird, deren Inhalt aufzulisten. Bei Argumenten, die Dateien benennen, werden nur die Informationen für die Datei selbst ausgedruckt. Mit dieser-d
Option werden Verzeichnisse wie Dateien behandelt. Sols
druckt die Informationen für jedes der Verzeichnisse aus , die als Argumente übergeben wird, so wie es tun würde , wenn sie Dateien sind.Es
-d
ist also keine Option "Nur Verzeichnisse drucken". Tatsächlich gibt es nicht nur keine solche Option; Es kann keine solche Option geben. Die Platzhaltererweiterung wird von der Shell durchgeführt, und (sh
zumindest unter POSIX ) kann die Shell nicht angewiesen werden, die Berechtigungs- und Dateitypbits zu überprüfen, wenn sie*
in eine Liste von Namen erweitert wird. Um nur eine Liste der Verzeichnisnamen zu erhalten, müssen Sie entweder denfind
Befehl verwenden, wie unter erläutertztank1013
, oder den Trick anwenden, dass ein mit einem Schrägstrich endender Pfadname den Verzeichniseintrag impliziert.
, wie unter erläutertJin
. (Jin
s Trick endet damit, dass derls
Befehl die Argumente empfängtweil das Muster
*/
tatsächlich Pfadnamen mit zwei Komponenten vergleicht, wobei die zweite leer ist und daher nicht genau das tut, was gewünscht wurde. Insbesondere werden symbolische Links, die auf Verzeichnisse verweisen, so behandelt, als wären sie Verzeichnisse.)Das Verhalten von
ls -d
ohne*
ist eine einfache Erweiterung des oben Gesagten. Man muss nur noch eines wissenls
: Wenn es keine Argumente gibt, nimmt es ein Standardargument von an.
. Nun , ohne die-d
Möglichkeit, die oben genannte Verhalten führt zu dem Inhalt des Verzeichnisses mit dem Namen von.
aufgezählt werden und die Informationen für seinen Inhalt angezeigt. Mit dieser-d
Option wird das Verzeichnis.
so behandelt, als ob es eine Datei wäre, und es werden statt des aufgezählten Inhalts seine eigenen Informationen angezeigt.quelle
dir /s *.txt
[ohne Platzhalter für find]ls
könnte eine Option zum Filtern von Dateien oder Verzeichnissen geben, und dies schließt sich nicht gegenseitig aus, wenn die Shell eine Erweiterung vornimmt . Es gibt keine Racebedingung in ls: Es kann gefiltert werden, da es die Dateien normal angibt. (Es gibt bereits einen Wettlauf zwischen der Shell-Erweiterung und ls, FWIW.) Ich denke, die Shell-Erweiterung ist nur ein Teil des Grundes: Die Shell-Erweiterung (und das Filtern im Allgemeinen) ist in ls nicht implementiert, da sie in cp erneut implementiert werden müsste , mv, etc. Unix ist ein "mach eins und mach es gut". Wenn Sie eine erweiterte Filterung benötigen, gibt es Tools dafür.ls -p
Option fügt/
nur Verzeichnissen ein Symbol hinzu . Es gibt keinen Grund, die Ausgabedruckfunktionen nicht um etwas zu erweitern, das nur diese (anstattls -p | grep /
) ausgibt .ls --only-directories .
Option eventuell ergänzt werden könntels
.Sie können
ls -d */
oderls -d .*/
für versteckte Verzeichnisse verwenden.quelle
Versuche dies
um nur Verzeichnisse unter Ihrem aktuellen Standort abzurufen.
quelle
Das könnte dir auch gefallen
Hier werden alle Verzeichnisse und Unterverzeichnisse mit einer grafischen Darstellung der Baumstruktur übersichtlich aufgelistet.
quelle
tree -dL 1
Wenn Sie Verzeichnisse nur mit der
ls -l
Option (ELL) anzeigen möchten, können Sie Folgendes verwenden:Oben finden Sie nur die Details, die Sie mit der
-l
Option erhalten.quelle
find -maxdepth 1 -type d -exec ls -d {} +
Ausgabe im üblichenls
Format zu erhalten.Wenn Sie den Job auf andere Weise erledigen möchten, versuchen Sie Folgendes:
ls -l | grep ^d
Obwohl ein einziges Werkzeug in dieser Situation ausreicht. Die Rohrleitung ist immer da, um Ihnen zu helfen. Mir gefällt die Flexibilität in Linux, die Sie wünschen.
quelle
Ich hoffe, dass dies Ihr Bedürfnis behebt. Der folgende Befehl listet nur Verzeichnisse in einem bestimmten Pfad auf.
Beispiel:
quelle