Есть ли способ получить ls
только отображение каталогов вместо файлов и каталогов?
Со страницы руководства:
-d, --directory
list directory entries instead of contents, and do not derefer‐
ence symbolic links
Поэтому, если я наберу его в /
каталоге, я ожидаю увидеть только каталоги. Вместо этого он показывает "."
$ cd /
$ ls -d
.
Я ожидал ls -d
показать мне это:
$ ls -d
bin data home opt sbin sys var
boot dev lib media proc selinux tmp
cdrom etc lost+found mnt root srv usr
Есть ли способ получить ls
только отображение каталогов вместо файлов и каталогов?
-d
это не только список каталогов, но и не список содержимого каталогов. Попробуйте набрать,ls */
и вы увидите содержимое всех каталогов.ldir
alised , чтобыls -d */
в моем ,.bashrc
чтобы сделать это проще ...Ответы:
Ваши ожидания основаны на DOS Think / Windows Think и ошибочны. В MS-DOS, Windows и некоторых других операционных системах IBM / Microsoft расширение по шаблону выполняется самой командой, а такие
/a
параметры, как опцияdir
команды, действуют как фильтры атрибутов при расширении по шаблону.dir
расширяет символы подстановки, например*
, которые интерпретатор команд передает ему как есть, и, если/a
указано, применяет соответствующие фильтры к возвращаемому. (В некоторых операционных системах фильтры атрибутов могут быть переданы системному вызову для перечисления каталога, и ядро операционной системы или драйверы его файловой системы применяют их самостоятельно.)В Unices и в Linux расширение подстановочных знаков выполняется оболочкой и не учитывает разрешения. Когда в корневом каталоге вы делаете
что сама
ls
команда получает от оболочки (что-то вроде)Что
-d
/--directory
опция делает отключить то , что обычно происходит дальше . Что обычно происходит дальше, так это тоls
, что он по очереди просматривает каждый из его аргументов, видит, что они являются каталогами, и решает перечислить их содержимое. Для аргументов, которые называют файлы, он просто выводит информацию для самого файла. С этой-d
опцией каталоги обрабатываются как файлы. Поэтомуls
выводит информацию для каждого из каталогов, которая передается в качестве аргументов, так же, как если бы они были файлами.Так что
-d
это не опция «только для печати каталогов». На самом деле такой возможности нет; не может быть такой возможности. Расширение с подстановочными знаками выполняется оболочкой, и (sh
по крайней мере, в POSIX ) нет способа указать оболочке проверять биты прав доступа и типов файлов при развертывании*
в список имен. Чтобы получить список только имен каталогов, необходимо либо использоватьfind
команду, как объясненоztank1013
, либо использовать хитрость, заключающуюся в том, что имя пути, заканчивающееся косой чертой, подразумевает запись каталога.
, как объясненоJin
. (Jin
трюк заканчивается тем, чтоls
команда получает аргументыпотому что шаблон
*/
на самом деле сопоставляет имена путей с двумя компонентами, причем второй является пустым, и поэтому не совсем делает то, что хотел. В частности, он будет обрабатывать символические ссылки, указывающие на каталоги, как если бы они были каталогами.)Поведение
ls -d
без*
является простым продолжением вышесказанного. Нужно просто знать еще одну вещьls
: когда ему не дают аргументов, он принимает аргумент по умолчанию.
. Теперь без этой-d
опции вышеупомянутое поведение приводит к тому, что содержимое каталога, названного путем.
перечисления, и информация для его содержимого отображаются. С помощью этой-d
опции каталог.
обрабатывается так же, как если бы это был файл, и отображается его собственная информация, а не перечисленное содержимое.источник
dir /s *.txt
[без обращения к кавычкам, как при поиске]ls
может иметь возможность фильтровать файлы или каталоги, и это не является взаимоисключающим условием расширения оболочки. Внутри ls нет условия гонки: он может фильтровать его, как обычно, для файлов. (Между расширением оболочки и ls, FWIW уже есть гонка.) Я думаю, что расширение оболочки - это только часть причины: расширение оболочки (и фильтрация в целом) не реализовано в ls, потому что его нужно будет снова реализовать в cp Unix - это "делай одно и делай это хорошо". Если вам нужна расширенная фильтрация, для этого есть инструменты.ls -p
Опция добавляет/
символ только к каталогам. Нет никаких причин не расширять возможности печати с помощью чего-то, что только выводит их (а неls -p | grep /
).ls --only-directories .
вариант может быть добавлен вls
конечном итоге.Вы можете использовать
ls -d */
илиls -d .*/
для скрытых каталогов.источник
Попробуй это
чтобы получить только каталоги под вашим текущим местоположением.
источник
Вам также может понравиться
который аккуратно перечисляет все каталоги и подкаталоги с графическим изображением древовидной структуры.
источник
tree -dL 1
Если вы хотите видеть каталоги только с подробной информацией, такой как
ls -l
(ELL), то вы можете использовать ниже:Выше будет только дать вам детали, как вы получаете с
-l
опцией.источник
find -maxdepth 1 -type d -exec ls -d {} +
чтобы получить вывод в обычномls
формате.Если вы хотите выполнить работу по-другому, попробуйте это:
ls -l | grep ^d
Хотя в этой ситуации достаточно одного инструмента. Трубопровод всегда рядом, чтобы помочь вам. Мне нравится гибкость в Linux, которую я желаю вам сделать.
источник
Я надеюсь, что это исправит вашу потребность. Команда ниже выведет список только каталогов по заданному пути.
Пример:
источник