52

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

8 ответов8

64

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

ls -d -- */

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

28

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

find . -mindepth 1 -maxdepth 1 -type d

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

12
find . -maxdepth 1 -type d

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

6

Даниэль ответ правильный. Вот несколько полезных дополнений.

Чтобы избежать отображения скрытых папок (например, .git), попробуйте это:

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

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

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

Вы "не должны" анализировать вывод ls, или так сказано. Причиной этого является то, что выходные данные предназначены для восприятия человеком, и это может усложнить анализ, если я помню.

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

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

for f in * ; do [ -d "$f" ] && echo $f is indeed a folder ; done
0

printf "%s\n" */ выведет список всех каталогов в $ PWD.

echo */ также будет работать, но в длинной одной строке сложнее, когда в именах есть пробелы.

0

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

du

Или же:

git ls-tree -d -r --name-only @
0

Просто чтобы подчеркнуть вещь, которая смутила меня здесь, в отношении выбора шаблонов глобуса; скажем, у вас есть это:

$ 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/

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .