Twoje oczekiwania są oparte na DOS Think / Windows Think i są błędne. W MS-DOS, Windows i rzeczywiście w kilku innych systemach operacyjnych IBM / Microsoft, interpretacja symboli zastępczych odbywa się przez samą komendę, a /aopcje takie jak opcja dirdziałają jako filtry atrybutów podczas ekspansji symboli zastępczych. dirrozwija znaki wieloznaczne, takie jak *, które interpreter poleceń przekazuje do niego w stanie, w jakim są, a jeśli /ajest określony, stosuje odpowiednie filtry do zwracanych danych. (W niektórych systemach operacyjnych filtry atrybutów można nadać wywołaniu systemowemu w celu wyliczenia katalogu, a jądro systemu operacyjnego lub jego sterowniki systemu plików zastosują je same).
W systemach Unices i Linux rozszerzanie symboli wieloznacznych odbywa się przez powłokę i nie zależy od uprawnień. Kiedy robisz to w katalogu głównym
ls *
to, co lssamo polecenie otrzymuje z powłoki (coś w stylu)
ls bin home opt var boot boot tmp etc utracone + znalezione root usr
Co -d/ --directoryopcja robi to wyłączyć, co zwykle dzieje się dalej . To, co zwykle dzieje się potem, polega na tym, że lsanalizuje kolejno każdy z argumentów, widzi, że są to katalogi i postanawia wyliczyć ich zawartość. W przypadku argumentów, które nazywają pliki, po prostu wypisuje informacje o samym pliku. Dzięki tej -dopcji katalogi są traktowane jak pliki. Tak więc lswypisuje informacje dla każdego z katalogów, które są przekazywane jako argumenty, tak jak zrobiłby to, gdyby były plikami.
Nie -d jest to więc opcja „drukuj tylko katalogi”. W rzeczywistości nie tylko nie ma takiej opcji; nie może być takiej opcji. Rozwijanie symboli wieloznacznych odbywa się przez powłokę i ( shprzynajmniej w POSIX ) nie ma sposobu, aby powiedzieć powłoce, aby sprawdzała bity uprawnień i typów plików, gdy rozwija *się do listy nazw. Aby uzyskać listę samych nazw katalogów, konieczne jest albo użycie findpolecenia, jak wyjaśniono ztank1013, lub użycie sztuczki, w której nazwa ścieżki kończąca się ukośnikiem oznacza pozycję katalogu ., jak wyjaśniono przez Jin. ( Jinlewą kończy się lspolecenie otrzymujące argumenty
ls bin / home / opt / var / boot / dev / tmp / etc / lost + found / root / usr /
ponieważ wzorzec */w rzeczywistości dopasowuje nazwy ścieżek do dwóch składników, drugi jest pusty, a więc nie do końca robi to, co było pożądane. W szczególności potraktuje dowiązania symboliczne wskazujące katalogi tak, jakby były katalogami).
Zachowanie ls -dbez a *jest prostym rozszerzeniem powyższego. Trzeba tylko wiedzieć jeszcze jedną rzecz ls: Gdy nie podano żadnych argumentów, zakłada się domyślny argument .. Teraz bez tej -dopcji, wyżej wymienione przewody zachowanie do zawartości katalogu, nazwanych przez .ich wyliczone, a informacje wyświetlane na jego zawartość. Dzięki tej -dopcji katalog .jest traktowany tak, jakby był plikiem, a wyświetlane są jego informacje, a nie ich zawartość.