Відповіді:
Ви можете використовувати:
ls -d -- */
Оскільки всі каталоги закінчуються, у /
цьому списку відображаються лише каталоги на поточному шляху. Параметр -d гарантує друкування тільки імен каталогів, а не їх вмісту.
ls -d -- */
та ls -d */
?
--
умовно використовується для позначення кінця параметрів, так що якщо файл названий -l
ls, він не буде інтерпретувати його як параметр формату довгого списку.
Відповідь Стівена Мартіна надіслала попередження і також вказала поточну папку, тому я б запропонував
find . -mindepth 1 -maxdepth 1 -type d
(Це в Linux; я не зміг знайти -maxdepth та -mindepth на сторінці користувача POSIX для пошуку)
ls -d -- */
варіант, оскільки я find
теж знайду приховані режими. Що іноді може бути корисним, але також іноді викликає неприємності. Сподіваюся, цей коментар може допомогти іншим. +1
Відповідь Даніеля правильна. Ось кілька корисних доповнень.
Щоб уникнути переліку прихованих папок (наприклад .git
), спробуйте:
find . -mindepth 1 -maxdepth 1 -type d \( ! -iname ".*" \)
І щоб замінити жахливу косу рису на початку find
виводу в деяких середовищах, використовуйте це:
find . -mindepth 1 -maxdepth 1 -type d \( ! -iname ".*" \) | sed 's|^\./||g'
Ви "не повинні" аналізувати висновок ls, або так сказано. Підстава полягає в тому, що результат повинен бути зрозумілим для людини, і це може зробити ускладнення розбору, якщо я пригадую.
якщо ви не хочете ls або знайти, ви можете спробувати відфільтрувати "*" за допомогою "[-d]".
Я зробив саме це, чомусь я знаю, що не працювали (я думаю, імена файлів з пробілами і дужками, я думаю, або щось інше, що я оглядав), тоді я щось робив за принципом
for f in * ; do [ -d "$f" ] && echo $f is indeed a folder ; done
Просто підкреслити те, що мене тут бентежило, щодо вибору глобальних моделей; скажіть, у вас це є:
$ cd /tmp
$ mkdir testglob
$ for ix in {00,01,02,03} ; do mkdir testglob/mydir_${ix} ; done
$ for ix in {00,01,02,03} ; do touch testglob/myfile_${ix} ; done
$ for ix in {00,01,02,03} ; do touch testglob/mydir_${ix}.txt ; done
$ for ix in {00,01,02,03} ; do mkdir testglob/otherdir_${ix} ; done
$ tree testglob/
testglob/
├── mydir_00
├── mydir_00.txt
├── mydir_01
├── mydir_01.txt
├── mydir_02
├── mydir_02.txt
├── mydir_03
├── mydir_03.txt
├── myfile_00
├── myfile_01
├── myfile_02
├── myfile_03
├── otherdir_00
├── otherdir_01
├── otherdir_02
└── otherdir_03
8 directories, 8 files
Отже, скажіть, що тут ви хочете вибрати лише mydir*
каталоги. Зауважте, що якщо ви не залишите косу рису, що закінчується, ls -d
список файлів також:
$ ls -d testglob/mydir* # also `ls -d -- testglob/mydir*`
testglob/mydir_00 testglob/mydir_01 testglob/mydir_02 testglob/mydir_03
testglob/mydir_00.txt testglob/mydir_01.txt testglob/mydir_02.txt testglob/mydir_03.txt
... однак із кінцевою косою рисою перелічені лише каталоги:
$ ls -d testglob/mydir*/ # also `ls -d -- testglob/mydir*/`
testglob/mydir_00/ testglob/mydir_01/ testglob/mydir_02/ testglob/mydir_03/
printf "%s\n" */
перерахує всі каталоги в $ PWD.
echo */
також буде працювати, але в довгій однорядковій складніше, коли в іменах є пробіли.
Ви також можете використовувати:
du
Або:
git ls-tree -d -r --name-only @