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 /aOption zum dirBefehl wirken als Attributfilter während der Platzhaltererweiterung. dirErweitert Platzhalter wie *, die der Befehlsinterpreter unverändert weitergibt, und /awendet 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 lsBefehl 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/ --directorywird deaktiviert, was normalerweise als Nächstes passiert . Was normalerweise als nächstes passiert, ist, dass lsjedes 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 -dOption werden Verzeichnisse wie Dateien behandelt. So lsdruckt 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 ( shzumindest 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 findBefehl 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. ( Jins Trick endet damit, dass der lsBefehl 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 -dohne *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 -dMö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 -dOption wird das Verzeichnis .so behandelt, als ob es eine Datei wäre, und es werden statt des aufgezählten Inhalts seine eigenen Informationen angezeigt.