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 zum dir
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
ls *
was der ls
Befehl selbst von der Shell erhält, ist (so etwas wie)
ls bin zu Hause opt var boot dev tmp etc verloren + gefunden root usr
Mit der Option -d
/ --directory
wird deaktiviert, was normalerweise als Nächstes passiert . Was normalerweise als nächstes passiert, ist, dass ls
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. So ls
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 den find
Befehl verwenden, wie unter erläutert ztank1013
, oder den Trick anwenden, dass ein mit einem Schrägstrich endender Pfadname den Verzeichniseintrag impliziert .
, wie unter erläutert Jin
. ( Jin
s Trick endet damit, dass der ls
Befehl die Argumente empfängt
ls bin / home / opt / var / boot / dev / tmp / etc / lost + found / root / usr /
weil 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 wissen ls
: 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.