Ваші очікування базуються на 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
параметра до каталогу .
поводиться так само, як якщо б це був файл, і відображається його власна інформація, а не перераховується його вміст.