Ваші очікування базуються на DOS Think / Windows Think та помиляються. У MS-DOS, Windows та, справді, декількох інших операційних системах IBM / Microsoft, розширення підстановки виконується самою командою, і такі речі, як /aопція dirкоманди, виконуються як фільтри атрибутів під час розширення wildcard. dirрозширює символи, подібні до того *, що інтерпретатор команд передає йому як є, і якщо /aвказано, він застосовує відповідні фільтри до поверненого. (У деяких операційних системах фільтри атрибутів можуть бути надані системному виклику для перерахування каталогу, а ядро операційної системи або його драйвери файлової системи застосовує їх самі.)
У Unices і на Linux розширення підстановки здійснюється оболонкою і не враховує дозволів. Коли в кореневому каталозі ви робите
ls *
те, що lsсама команда отримує з оболонки (щось на зразок)
ls bin home opt var boot dev tmp тощо загублений + знайдений root usr
Що робить -d/ --directoryваріант, це вимкнути те, що зазвичай відбувається далі . Що зазвичай відбувається далі, це те, що lsпереглядає по черзі кожен з його аргументів, бачить, що вони є каталогами, і вирішує перерахувати їх зміст. Для аргументів, які називають файли, він просто виводить інформацію для самого файлу. За допомогою -dпараметра каталоги трактуються так само, як файли. Тому lsдрукується інформація для кожного із каталогів, яка передається як її аргументи, так само, як це було б, якби вони були файлами.
Тому -d не є опцією "друкувати лише каталоги". Насправді, не тільки немає такого варіанту; не може бути такого варіанту. Розширення підстановки здійснюється оболонкою, і (як shмінімум у POSIX ) немає способу сказати оболонці перевірити біти дозволу та типу файлу, коли він розгортається *до списку імен. Щоб отримати список імен каталогів самостійно, необхідно або використовувати findкоманду, як пояснено ztank1013, або використовувати хитрість, що ім'я шляху, що закінчується косою косою рисою, передбачає запис у каталог ., як пояснено з Jin. ( Jinтрюк закінчується lsкомандою, що отримує аргументи
ls bin / home / opt / var / boot / dev / tmp / тощо / загублений + знайдений / root / usr /
оскільки модель */насправді відповідає іменам шляхів з двома компонентами, другий - порожнім, і тому не зовсім робить те, що було бажано. Зокрема, він буде ставитися до символьних посилань, що вказують на каталоги так, ніби вони є каталогами.
Поведінка ls -dбез а *є простим продовженням вищезазначеного. Потрібно просто знати ще одне про те ls: Коли йому не дано аргументів, він приймає аргумент за замовчуванням .. Тепер без на -dвиборі, згадане вище поведінка призводить до змісту каталогу названого .бути перераховані і інформація для його змісту відображається. За допомогою -dпараметра до каталогу .поводиться так само, як якщо б це був файл, і відображається його власна інформація, а не перераховується його вміст.