Ihre Erwartungen basieren auf DOS Think/Windows Think und sind falsch. Unter MS-DOS, Windows und einigen anderen IBM/Microsoft-Betriebssystemen wird die Wildcard-Erweiterung durch den Befehl selbst und Dinge wie /a
durchgeführt Option zum dir
fungieren während der Platzhaltererweiterung als Attributfilter. dir
erweitert Platzhalter wie *
, die der Befehlsinterpreter unverändert an ihn übergibt, und wenn /a
angegeben ist, wendet es die entsprechenden Filter auf das an, was zurückgegeben wird. (Auf einigen Betriebssystemen können die Attributfilter dem Systemaufruf zum Auflisten eines Verzeichnisses übergeben werden, und der Kernel des Betriebssystems oder seine Dateisystemtreiber wenden sie selbst an.)
Auf Unices und Linux wird die Wildcard-Erweiterung von der Shell durchgeführt und berücksichtigt keine Berechtigungen. Wenn Sie im Stammverzeichnis
ausführenls *
was zum ls
Befehl selbst empfängt aus der Shell ist (etwas wie)
ls bin home opt var boot dev tmp etc lost+found root usr
Was zum -d
/--directory
Option ist auszuschalten, was normalerweise als nächstes passiert . Was normalerweise als nächstes passiert, ist ls
schaut sich jedes seiner Argumente der Reihe nach an, stellt fest, dass es sich um Verzeichnisse handelt, und beschließt, deren Inhalt aufzuzählen. Bei Argumenten, die Dateien benennen, werden nur die Informationen für die Datei selbst ausgegeben. Mit dem -d
Option werden Verzeichnisse wie Dateien behandelt. Also ls
gibt die Informationen für jedes der Verzeichnisse aus, die als Argumente übergeben werden, genau so, als wären es Dateien.
Also -d
nicht eine Option "Nur Verzeichnisse drucken". Tatsächlich gibt es nicht nur keine solche Option; es kann nicht sein eine solche Möglichkeit. Die Wildcard-Erweiterung wird von der Shell durchgeführt und (in einem POSIX sh
zumindest) gibt es keine Möglichkeit, die Shell anzuweisen, die Berechtigungs- und Dateitypbits zu überprüfen, wenn sie *
erweitert in eine Namensliste. Um nur eine Liste der Verzeichnisnamen zu erhalten, muss entweder der find
verwendet werden Befehl, wie in ztank1013
erklärt , oder um den Trick zu verwenden, dass ein Pfadname, der mit einem Schrägstrich endet, den Verzeichniseintrag .
impliziert , wie von Jin
erklärt . (Jin
Der Trick von endet mit der ls
Befehl, der die Argumente
ls bin/ home/ opt/ var/ boot/ dev/ tmp/ etc/ lost+found/ root/ usr/
weil das Muster */
entspricht tatsächlich Pfadnamen mit zwei Komponenten, wobei die zweite leer ist, und ist daher nicht ganz tun, 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. Zu ls
muss man einfach noch etwas wissen :Wenn keine Argumente angegeben werden, nimmt es ein Standardargument von .
an . Jetzt ohne der -d
Option führt das oben genannte Verhalten zum Inhalt des Verzeichnisses mit dem Namen .
aufgezählt und die Informationen für ihren Inhalt angezeigt. Mit der -d
Option das Verzeichnis .
wird so behandelt, als ob es sich um eine Datei handelt, und es werden ihre eigenen Informationen angezeigt, anstatt ihren Inhalt aufzuzählen.
Sie können ls -d */
verwenden , oder ls -d .*/
für versteckte Verzeichnisse.
Versuchen Sie dies
find . -mindepth 1 -maxdepth 1 -type d
um nur Verzeichnisse unter Ihrem aktuellen Standort zu erhalten.