Есть ли какая-либо опция с командой 'ls', чтобы я видел только каталоги?

74

Иногда мне нужно проверять только каталоги, а не файлы. Есть ли опция с командой ls? Или есть какая-нибудь полезность для этого?

РЕДАКТИРОВАТЬ : я использую Mac OS X, и ls -dдает мне, .хотя у меня есть каталоги.

prosseek
источник
4
Может кто-нибудь объяснить, почему ls -dдает только .и почему */должны быть добавлены в конце, чтобы это работало?
cwd
3
@cwd Если вы не указали никаких файлов, по lsумолчанию используется .. А -dзначит не печатать содержимое каталога, а печатать сам каталог.
Микель
1
@cwd попробуйте использовать ls -pэто показывает /после имени каталога. Так что */это просто шаблон, который сопоставляется с именем каталога и /комбо.
Питт
Я создал функцию, реализующую ответ @ Steven_D для моего файла ~ / .bash_aliases: gist.github.com/rjurney/998f4951a57bfa5daeb9a6c18f6f4827
rjurney

Ответы:

84

Я знаю, что уже есть выбранный ответ, но вы можете получить запрошенное поведение просто ls:

ls -ld -- */

(Обратите внимание, что «-» отмечает конец параметров, предотвращая интерпретацию имен папок, начинающихся с дефиса, как дополнительных параметров команды.)

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

ls -ld /path/to/directory/*/

Обратите внимание, что -l является необязательным.

Стивен Д
источник
5
Приятно. Я никогда не думал, что каталоги имеют неявное /завершение - но теперь, когда я вижу, что вы отвечаете, это имеет смысл. В конце концов, табуляция всегда добавляет его.
gvkv
-d for dir, -l for long format, Какова цель --?
Динешкумар
1
Хотя это выглядит кратко и работает в большинстве случаев, возможно, вы не захотите использовать этот подход, когда нужен настоящий каталог, а не символическая ссылка на каталог. Так что findэто действительно хороший выбор в этом случае.
biocyberman
1
findтакже имеет преимущество, когда число каталогов превышает максимальную длину аргумента.
Стивен Д
Работая в обратном направлении, я просто понял , что вы можете просто игнорировать все , что с расширением: ls -alhF --ignore=*.*. Не уверен , насколько хорошо это будет обрабатывать «скрытые» папки, то есть.myHiddenFolder
Timmah
14

Нет, но простая findкоманда сделает это:

find . -type d -depth 1

или же grep

ls -F | grep /

Вы можете затем псевдоним любой из них, если это необходимо.

gvkv
источник
6
На Ubuntu 14.04 это было -maxdepth 1. Также findхотел, чтобы я перевернул заказ:find . -maxdepth 1 -type d
Брэд Купит
Это ls -F | grep /решение творит чудеса! Кажется, это единственная возможность работать на моей машине с FreeBSD. Я думаю, что использование рыбы означает, что что-нибудь с */может не работать?
CJM
Я никогда не работал с Fish, поэтому я не уверен в этом, но опция -F может творить чудеса.
gvkv
7

Мне нравится утилита дерева, чтобы получить обзор структуры каталогов. Он доступен в MacPorts и во всех дистрибутивах Linux, которые я пробовал.

tree -d -L 2

Это показало бы все каталоги, два уровня глубоко.

Клас Могрен
источник
6

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

ls -d -- */ .*/

(в зависимости от оболочки, которая также может включать .и ..)

Нил Чендлер
источник
2

С zsh(как было установлено по умолчанию в macOS, он даже был /bin/shтам), вы бы использовали квалификаторы glob для выбора файлов на основе их типа:

  • Список не скрытых каталогов:

    ls -d -- *(/)
    
  • Список всех каталогов:

    ls -d -- *(D/)
    

    ( .и ..всегда исключаются, добавляйте их по отдельности, если хотите)

  • Также добавьте символические ссылки на каталоги:

    ls -d -- *(D-/)
    

    ( -делает так, чтобы дальнейшие квалификаторы применялись после разрешения символической ссылки).

Стефан Шазелас
источник
-1

Я думаю, что у ls есть ошибка в Mac OS X. Обходной путь должен использовать grep ... ls -l / | grep "^d"

duffbeer703
источник
1
Приятно знать, что я не единственный, кто использует этот grep "^d"хак
Майкл Мрозек
6
Насколько я знаю, поведение, которое он описывает, не является ошибкой и является таким же, если вы используете GNU ls. Опция -d отображает список для каталога, а не его содержимое. Чтобы понять, почему это может быть полезно, посмотрите разницу между: ls -l /homeиls -dl /home
Стивеном Д.
Караты не являются особенными для раковины. Вы можете просто использовать ls -l / | grep ^d. Если будут собираетесь использовать кавычки, так как вам не нужно расширение параметров, сделать их одиночные кавычки. ls -l / | grep '^d', Да, я педант. Но на самом деле, сделай это. :)
Wildcard
-1
$ ls -p | grep /

-pФлаг заставит lsдобавить слэш ( '/') после каждого файла , если этот файл является каталогом.

Джамин Шанти
источник
-2

Самый простой способ - набрать следующую команду. Это работает на большинстве платформ и версий UNIX и Linux. Вы можете пропустить, -Fесли хотите, но это аргумент, который добавляет / в конец имени каталога. -CАргумент захватывает только имена каталогов - все они в текущем каталоге. Если вы хотите видеть только каталоги и подкаталоги в текущем пути, просто добавьте -Rаргумент ( ls -CFR).

# ls -CF
/dir1  /dir2  /dir3  /beaches  /Work  /Other 
Вилли Лопес
источник
1
Во всех lsреализациях, которые я знаю и в спецификации POSIX ls, -Cэто вывод в столбцах , а не пропуск файлов, не являющихся каталогами. В вашем примере /они печатаются перед именами файлов, чего не lsможет сделать ни одна реализация. С -F, /добавляется к имени файла для файлов каталога.
Стефан Шазелас
Когда я увидел этот ответ, я подумал: «Где это правда?» @ StéphaneChazelas и Jeff Schaller - разве вы не отрицаете откровенно неправильные ответы?
G-Man
-3
ls -G

это покажет ваши каталоги синим цветом

user197967
источник
1
Вы видите только каталоги при использовании этой команды?
don_crissti