Чи є правильний спосіб перелічити підкаталоги поточного каталогу?


10

Я можу знайти підкаталоги каталогів за

ls -d -- */

або

ls -l | grep "^d"

але обидва вони здаються непрямими, і я б міг уявити, що існує стандартний спосіб знайти саме каталоги. Чи є правильний спосіб зробити це? І якщо ні, чи призведе будь-яке з цих випадків до небажаної поведінки у кращих випадках? (Символічні посилання, приховані каталоги тощо)

Відповіді:


17

Відповідь залежатиме більше від того, що ви маєте намір зробити з результатом, ніж від того, що ви шукаєте. Якщо ви просто хочете побачити список для візуального ознайомлення на терміналі, ваше перше рішення насправді дуже приємне. Якщо ви хочете обробити результат, вам слід розглянути можливість використання іншого методу.

Один з найбільш надійних способів отримати список для подачі в іншу програму - це використовувати find.

find -maxdepth 1 -type d

Причина, чому це добре для каналів, полягає в тому, що вони findможуть виводити дані, розділені нулями, використовуючи -print0або правильно виводячи рядки як аргументи для інших програм, що використовують -exec. Для отримання довідки про те, чому це краще, ніж аналіз виводу ls, дивіться ParsingLS у Вікі Грега.


4
Мені довелося набрати, find . -maxdepth 1 -type dщоб це працювало на OS X Yosemite.
Шон Левін

1
щоб перелічити підкаталоги, потрібно також вказати -mindepth як у find . -maxdepth 1 -mindepth 1 -type d. Інакше .буде включений поточний каталог .
бляшанка

5

FYI - В ЗШ (але не BASH), ви також можете зробити це: ls -d -- *(/); модифікатор говорить ЗШ тільки Глоби каталогам.(/)

Однак це не дуже відрізняється від запропонованого вами рішення ( ls -d -- */), і далеко не стандартне.

Що стосується виходу ls(який, ймовірно, відрізняється від інших прапорів):

% ls
dir0 dir1 dir2 file0 file1 file2
% ls -d -- */
dir0/ dir1/ dir2/
% ls -d -- *(/)
dir0 dir1 dir2

zsh розширює зірочку на всі файли та каталоги, прапор (/) вибирає частини цього розширення, щоб ls * (/) також працював, а також echo * (/) або більш zshly способом print -l * (/ ) . Дві перші версії також працюють в bash.
Тор

1
Зауважте, що він *(/)розширюється на не приховані каталоги, в той час як */розширюється на не приховані каталоги або посилається на каталоги (або принаймні символізує шляхи, для яких ми можемо сказати, що вони є каталогами).
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.