Как перечислить папки с помощью команд bash?

Есть ли способ перечислить только папки в каталоге с помощью команд bash? ( ls команда ls перечисляет все файлы и папки)

  • Как найти все ссылки (символические ссылки) в текущем каталоге?
  • Как перечислить файлы рекурсивно и отсортировать их по времени модификации?
  • Листинг файлов по времени последнего доступа?
  • Каков волшебный разделитель между именами файлов в ls output?
  • Что означает звездочка после имени файла при вводе `ls -l`?
  • Альтернативы cd / ls для навигации по командной строке?
  • Что означает значение @ на выходе «ls» на терминале OS X?
  • ITerm2 теряет цвета «ls», если я ssh на сервере
  • 7 Solutions collect form web for “Как перечислить папки с помощью команд bash?”

    Вы можете использовать:

     ls -d -- */ 

    Поскольку все каталоги заканчиваются на / , это перечисляет только каталоги в текущем пути. Параметр -d гарантирует, что будут напечатаны только имена каталогов, а не их содержимое.

    Ответ Стивена Мартина дал предупреждение и также перечислил текущую папку, поэтому я бы предложил

     find . -mindepth 1 -maxdepth 1 -type d 

    (Это на Linux, я не мог найти -maxdepth и -mindepth на странице руководства POSIX для поиска)

     find . -maxdepth 1 -type d 

    Перечислит только папки. И как указал Тедди, вам понадобится -maxdepth, чтобы остановить его повторное вторжение в sub dirs

    Ответ Даниила правильный. Вот некоторые полезные дополнения.

    Чтобы исключить список скрытых папок (например, .git ), попробуйте следующее:

     find . -mindepth 1 -maxdepth 1 -type d \( ! -iname ".*" \) 

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

     find . -mindepth 1 -maxdepth 1 -type d \( ! -iname ".*" \) | sed 's|^\./||g' 

    Вы «не должны» анализировать вывод ls, или так сказано. Обоснование заключается в том, что выход предназначен для чтения человеком и может сделать его излишне сложным для анализа, если я помню.

    Если вы не хотите ls или find, вы можете попробовать фильтровать «*» с помощью «[-d]».

    Я сделал именно это, по какой-то причине ls и find не работали (имена файлов с пробелами и скобками, которые, я думаю, или что-то еще, что я просматривал), тогда я сделал что-то вроде строк

     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 файлы:

     $ 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 */ также будет работать, но в длинной однострочной, более сложной, когда имена имеют пробелы.

    Давайте будем гением компьютера.