44

Есть ли способ заставить 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 отображать только каталоги, а не файлы и каталоги?

7 ответов7

50

Ваши ожидания основаны на DOS Think/Windows Think и ошибочны. В MS-DOS, Windows и некоторых других операционных системах IBM/Microsoft расширение по шаблону выполняется самой командой, а такие вещи, как параметр /a для команды dir выступают в качестве фильтров атрибутов во время расширения по шаблону. dir расширяет подстановочные знаки, такие как * , которые интерпретатор команд передает ему как есть, и, если указан параметр /a он применяет соответствующие фильтры к тому, что возвращается. (В некоторых операционных системах фильтры атрибутов могут передаваться системному вызову для перечисления каталога, и ядро операционной системы или драйверы его файловой системы применяют их самостоятельно.)

В Unices и в Linux расширение подстановочных знаков выполняется оболочкой и не учитывает разрешения. Когда в корневом каталоге вы делаете

ls *

что сама команда ls получает от оболочки (что-то вроде)

ls bin home opt var boot dev tmp etc lost+found root usr

Опция -d/--directory отключает то, что обычно происходит дальше. Далее обычно происходит следующее: ls просматривает каждый из своих аргументов по очереди, видит, что они являются каталогами, и решает перечислить их содержимое. Для аргументов, которые называют файлы, он просто печатает информацию для самого файла. С опцией -d каталоги обрабатываются как файлы. Поэтому ls выводит информацию для каждого из каталогов, передаваемую в качестве аргументов, так же, как если бы они были файлами.

Так что -d не является опцией "только для печати каталогов". На самом деле, не только нет такой возможности; не может быть такой возможности. Расширение с подстановочными знаками выполняется оболочкой, и (по крайней мере, в POSIX sh ) нет способа указать оболочке проверять биты прав доступа и типа файла, когда она расширяется * в список имен. Чтобы получить список имен каталогов в одиночку, необходимо либо использовать команду find , как объяснено в ztank1013 , либо использовать хитрость, заключающуюся в том, что путь, заканчивающийся косой чертой, подразумевает запись каталога . как объяснил Jin . (Уловка Jin заканчивается тем, что команда ls получает аргументы

ls bin/ home/ opt/ var/ boot/ dev/ tmp/ etc/ lost+found/ root/ usr/

потому что шаблон */ на самом деле совпадает с путевыми именами с двумя компонентами, второй является пустым, и поэтому не совсем делает то, что хотел. В частности, он будет обрабатывать символические ссылки, указывающие на каталоги, как если бы они были каталогами.)

Поведение ls -d без * является простым расширением вышеприведенного. Нужно просто знать еще одну вещь о ls: когда ему не дано никаких аргументов, он принимает аргумент по умолчанию . , Теперь без опции -d вышеупомянутое поведение приводит к содержимому каталога с именем . перечисляются и информация для его содержания отображается. С опцией -d , каталог . обрабатывается так же, как если бы это был файл, и отображается его собственная информация, а не перечисленное содержимое.

30

Вы можете использовать ls -d */ или ls -d .*/ Для скрытых каталогов.

13

Попробуй это

 find . -mindepth 1 -maxdepth 1 -type d

чтобы получить только каталоги под вашим текущим местоположением.

5

Если вы хотите видеть каталоги только с такими подробностями, как опция ls -l (ELL), вы можете использовать ниже:

find -maxdepth 1 -type d -ls;

Выше вы увидите только детали, которые вы получаете с опцией -l .

5

Вам также может понравиться

tree -d 

который аккуратно перечисляет все каталоги и подкаталоги с графическим изображением древовидной структуры.

4

Если вы хотите выполнить работу по-другому, попробуйте это:

ls -l | grep ^d

Хотя в этой ситуации достаточно одного инструмента. Трубопровод всегда рядом, чтобы помочь вам. Мне нравится гибкость в Linux, которую я желаю вам сделать.

1

Я надеюсь, что это исправит вашу потребность. Команда ниже выведет список только каталогов по заданному пути.

ls -F <path> | grep /

Пример:

ls -F ~ | grep /

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .