Ответы:
Вы можете использовать:
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 или find, вы можете попробовать отфильтровать "*" с помощью "[-d]".
Я сделал именно это, по какой-то причине ls и обнаружил, что он не работал (имена файлов с пробелами и скобками, я думаю, или что-то еще, что я пропустил), затем я сделал что-то вроде
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 @