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


219

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


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

Ответы:


315

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


17
Эй, это довольно изящно, я всегда к нам привык ls -al | grep '^d'- это гораздо лаконичнее.
paxdiablo

43
зачем использовать * / ?? пожалуйста, объясни!?
Чандип

6
У меня нет правильного объяснения, однако я знаю, что */принудительно отображает только элементы, заканчивающиеся косой чертой, которая в этом случае будет каталогом, даже если -Fопция lsне используется. Аналогично поведению ls *phpи тому, как отображаются все файлы, оканчивающиеся phpна каталог.
Дэвид Хэнкок

3
@ user975234 Кто-то задал похожий вопрос, и есть довольно хорошее объяснение опубликованной ссылки
user1766760

17
Просто echo */сделаю то же самое
nos

95

Попробуй это:

find . -maxdepth 1 -type d

8
Для меня это выглядит так, как это должно быть сделано. В отличие от предложенных lsрешений, findон несет единоличную ответственность за выполнение работы (не полагаясь на расширение подстановочного знака оболочки, которое может накладывать ограничения). Это также намного более кратко.
Петер

1
Плохая вещь в том, что это не работает, если вы пытаетесь перебрать результаты, и ваши результаты имеют пробелы в именах.
убиквибакон

2
С другой стороны , если вы не хотите включать в себя сам каталог: find * -maxdepth 0 -type d.
Джеймс Ко

@ubiquibacon использовать либо find«с -print0или -execвариант.

1
Это действительно медленно, по крайней мере, на моем Mac. Похоже, он выполняет полный рекурсивный поиск, который findобычно выводит, но выводит папки только на глубине 1.
Кара Брайтвелл,

22

Последующий

find * -maxdepth 0 -type d

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

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


13

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

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

Например ZSH:

zsh # ls *(/)

3
С каким вкусом Unix вы получаете tree?
Johnsyweb

например, все основные проблемы Linux? извини, я не понимаю вопрос?
echox

1
У меня есть дистрибутив Debian, и treeон не установлен по умолчанию (хотя он есть в репозиториях).
Стивен Шраугер

1
Я считаю, что эта treeкоманда не является родной командой Unix (исправьте меня, если я ошибаюсь).
Тьяго Кардосо

10

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

tree -d -L 1 -i --noreport
  • -d: каталоги
  • -L: глубина дерева (отсюда 1, наш рабочий каталог)
  • -i: без отступа, печатать только имена
  • --noreport: не сообщать информацию в конце списка дерева

И спасибо за объяснение переключателей. Переполнение стека связано с ответами, я всегда ценю, когда люди делают то же, что и вы, с объяснением, а не с «просто прочитайте запись человека!» <- это не ответ.
fusion27

Чтобы начать со строки 2 (пропустите строку только с точкой):tree -d -L 1 -i --noreport | tail -n +2
adius

Это решение с наивысшим рейтингом, которое перечисляет каталоги с мягкими связями и делает это полезным способом, выставляя их в виде ссылки. Я предпочитаю вариант:tree -C -d -L 1 -i --noreport | tail -n+2
Амнон Харел

9
ls -l | grep '^d'

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

alias ld="ls -l| grep '^d'"

1
ссылки не просматриваются этой командой. И ссылка может быть файлом или каталогом. Пример: lrwxrwxrwx 1 root root 21 avril 15 17:38 cron -> / lib / init / upstart-job.
c-toesca

7
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'

☀ найти. -maxdepth 1 -тип d -name [^ \.] * | sed 's: ^ \ ./ ::' zsh: совпадений не найдено: [^.] *
Майкл Коул

6

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


6

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

ls -d */ | sed -e "s/\///g"

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

Спасибо! Я просто хотел список каталогов без всех разрешений, и это помогло. :)
codingjeremy

5

find specifiedpath -type d

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

find specifiedpath -type d -mindepth 1 -maxdepth 1

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

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


1
Upvote за упоминание, mindepthчтобы избавиться от .! Ad
adius

5

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

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

echo *(/)

И все каталоги в текущем рабочем каталоге будут отображаться.

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

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

find . -maxdepth 1 -type d -print  

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


4

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

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

6 directories

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


Я не понизил, просто был тот же вопрос. Похоже, ваш ответ - обманщик эха, может, поэтому?
Луи Ваверу

1
@ Луис - спасибо, я даже не заметил его упоминания tree. О, хорошо, я не собирался красть чей-то гром.
Slm

голосование за визуализацию того, что делает дерево
Андрейс

Я полагаю, что отрицательные отзывы объясняются тем, что это тот же ответ, что и stackoverflow.com/a/3667405/523742
Тиаго Кардосо

@TiagoCardoso - мой предшествует этому на 2 года.
SLM

2

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

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 отсутствует.


2
### 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*"

1

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

`ls -F | grep /`

(Но я echo */перехожу к тому, что упомянуто @nos)


1

Вот еще одно решение, которое показывает связанные каталоги. Я немного предпочитаю это, потому что это подмножество "нормального" вывода ls -l:

ls -1d */ | rev | cut -c2- | rev | xargs ls -ld --color=always

1

В Баш:

ls -d */

Перечислим все каталоги

ls -ld */

перечислит все каталоги в длинной форме

ls -ld */ .*/

перечислит все каталоги, включая скрытые каталоги, в полной форме.


Я недавно переключился на zsh (MacOS Catalina) и обнаружил, что:

ls -ld */ .*/

больше не работает, если текущий каталог не содержит скрытых каталогов.

zsh: no matches found: .*/

Это напечатает вышеупомянутую ошибку, но также не сможет печатать любые каталоги.

ls -ld *(/) .*(/)

Также терпит неудачу таким же образом.

До сих пор я обнаружил, что это:

ls -ld */;ls -ld .*/

это достойный обходной путь. Это ;разделитель команд. Но это означает, что если нет скрытых каталогов, он выведет список каталогов и все равно напечатает ошибку без скрытых каталогов:

foo
bar
zsh: no matches found: .*/

lsэто команда оболочки для списка содержимого текущего каталога
-lявляется флаг , чтобы указать , что вы хотите , чтобы список в Лонгфорда (один элемент в каждой строке + куча другой информации прохладного)
-dявляется флагом , чтобы перечислить все каталоги «как файлы» , а не рекурсивно
*/является Аргумент «перечислить все файлы, заканчивающиеся косой чертой»
*- это простая команда регулярного выражения для «чего угодно», поэтому */просит оболочку перечислить «что угодно, заканчивающееся на« / »»

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


Я положил это:

alias lad="ls -ld */;ls -ld .*/"

в моем .zshrc, и, кажется, работает нормально.

ПРИМЕЧАНИЕ: я также обнаружил, что

ls -ld .*/ 2> /dev/null

не работает, так как он все еще печатает Sterr в терминал. Я обновлю свой ответ, если / когда найду решение.


0

du -d1возможно самый короткий вариант. (Пока вам не нужно передавать данные в другую команду.)


0

Чтобы получить список только каталогов по указанному пути, просто введите ls -l | grep drw


Это может включать файлы, если есть имена файлов drw, и исключать любые каталоги, которые не читаются и не пишутся владельцем. grep ^dработает лучше.
Том

0

Длинный список каталогов

  • ls -l | grep '^ d'
  • ls -l | grep "^ d"

Список каталогов
- ls -d * /


У вас есть веская причина для дублирования уже существующих ответов?
Максим Сагайдачный
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.