Список только каталогов в UNIX

164

Я хочу указать только каталоги в указанном пути (ls не имеет такой опции). Кроме того, это можно сделать с помощью одной строки?

  • 10
    На будущее: может быть, лучше задать вопросы типа Unix / Linux, не связанные с программированием, не такие сложные: unix.stackexchange.com
Теги:

15 ответов

260

Попробуйте это ls -d */, чтобы просмотреть каталоги в текущем каталоге

  • 17
    Эй, это довольно изящно, я всегда привык к нам ls -al | grep '^d' - это гораздо лаконичнее.
  • 1
    Это, однако, дает, например, ls: */: No such file or directory на stderr если в рабочем каталоге нет каталога. (Удалена ерунда о -d до -d других комментариев).
Показать ещё 12 комментариев
77

Попробуйте следующее:

find . -maxdepth 1 -type d
  • 7
    Для меня это выглядит так, как это должно быть сделано. В отличие от предлагаемых решений ls , find несет полную ответственность за выполнение работы (не полагаясь на расширение подстановочного знака оболочки, которое может накладывать ограничения). Это также намного более кратко.
  • 1
    Плохая вещь в том, что это не работает, если вы пытаетесь перебрать результаты, и ваши результаты имеют пробелы в именах.
Показать ещё 5 комментариев
12

Следующие

find * -maxdepth 0 -type d

в основном фильтрует расширение '*', т.е. все записи в текущем каталоге, в соответствии с условием -type d.

Преимущество в том, что вывод такой же, как ls -1 *, но только с каталогами и записи не начинаются с точки

10

Вы можете использовать ls -d */ или tree -d

Другим решением будет globbing, но это зависит от используемой оболочки и поддержки подстановки для каталогов.

Например, ZSH:

zsh # ls *(/)
  • 2
    С каким вкусом Unix вы получаете tree ?
  • 0
    например, все основные проблемы Linux? извини, я не понимаю вопрос?
Показать ещё 2 комментария
7

Поскольку существует множество способов сделать это, вот еще один:

tree -d -L 1 -i --noreport
  • -d: каталоги
  • -L: глубина дерева (следовательно, 1, наш рабочий каталог)
  • -i: нет отступов, только имена печати
  • - noreport: не сообщать информацию в конце списка деревьев
  • 0
    И спасибо за объяснение переключателей. Переполнение стека связано с ответами, я всегда ценю, когда люди так же, как вы, с объяснением, а не просто "просто прочитайте запись человека!" <- это не ответ.
  • 0
    Чтобы начать со строки 2 (пропустите строку только с точкой): tree -d -L 1 -i --noreport | tail -n +2
Показать ещё 1 комментарий
7
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'
  • 0
    ☀ найти. -maxdepth 1 -тип d -name [^ \.] * | sed 's: ^ \ ./ ::' zsh: совпадений не найдено: [^.] *
5
ls -l | grep '^d'

Вы можете создать псевдоним и поместить его в файл профиля

alias ld="ls -l| grep '^d'"
  • 0
    ссылки не просматриваются этой командой. И ссылка может быть файлом или каталогом. Пример: lrwxrwxrwx 1 root root 21 avril 15 17:38 cron -> / lib / init / upstart-job.
  • 6
    ld - очень плохое имя для псевдонима.
5

Ответ будет зависеть от вашей оболочки.

В zsh, например, вы можете сделать следующее:

echo *(/)

И будут показаны все каталоги в текущем рабочем каталоге.

Подробнее см. man zshexpn.

Альтернативным подходом было бы использовать find(1), который должен работать на большинстве вкусов Unix:

find . -maxdepth 1 -type d -print  

find(1) имеет много применений, поэтому я определенно рекомендую man find.

  • 0
    @ downvoter: Что не так с этим ответом?
4

Вы можете использовать команду tree со своим переключателем d, чтобы выполнить это.

% tree -d tstdir
tstdir
|-- d1
|   `-- d11
|       `-- d111
`-- d2
    `-- d21
        `-- d211

6 directories

см. man tree для получения дополнительной информации.

  • 3
    Почему отрицательные голоса? Это решает проблему.
  • 0
    Я не понизил, просто был тот же вопрос. Похоже, твой ответ - обманщик эха, может, поэтому?
Показать ещё 7 комментариев
3

используйте это, чтобы получить список каталогов

ls -d */ | sed -e "s/\///g"
  • 0
    ls -d <путь к каталогу пользователя> | sed -e "s / \ /// g" не работает .. какие-нибудь подсказки?
2

Чтобы перечислить каталоги в текущем рабочем каталоге ls -d */. И если вам нужно перечислить скрытые каталоги, используйте эту команду ls -d .*/

2

find specifiedpath -type d

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

find specifiedpath -type d -mindepth 1 -maxdepth 1

Обратите внимание, что будут также перечислены "точечные" каталоги (название которых начинается с .); но не специальные каталоги . и ... Если вам не нужны "точечные" каталоги, вы можете просто выбрать grep:

find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'

1

Это работает для меня:

`ls -F | grep /`

(Но я переключаюсь на echo */, как упоминалось в @nos)

1

Если у меня есть этот каталог:

ls -l

lrwxrwxrwx  1 nagios nagios     11 août   2 18:46 conf_nagios -> /etc/icinga
-rw-------  1 nagios nagios 724930 août  15 21:00 dead.letter
-rw-r--r--  1 nagios nagios  12312 août  23 00:13 icinga.log
-rw-r--r--  1 nagios nagios   8323 août  23 00:12 icinga.log.gz
drwxr-xr-x  2 nagios nagios   4096 août  23 16:36 tmp

Чтобы получить все каталоги, используйте -L для разрешения ссылок:

ls -lL | grep '^d'

drwxr-xr-x 5 nagios nagios   4096 août  15 21:22 conf_nagios
drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

Без -L:

ls -l | grep '^d'

drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp
Не найден каталог

conf_nagios.

0
### If you need full path of dir and list selective dir with "name" of dir(or dir_prefix*):
find $(pwd) -maxdepth 1 -type d -name "SL*"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню