Как вывести список папок с помощью команд bash?


52

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

Ответы:


66

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

ls -d -- */

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


2
ls - * / перечисляет все каталоги с их содержимым ниже
Винс

2
@ 8088 В чем разница между ls -d -- */и ls -d */?
Луи

5
@Louis, --обычно используется для обозначения конца опций, так что если файл называется -lls, он не будет интерпретироваться как опция формата длинного списка.
Кристиан Чиупиту

29

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

find . -mindepth 1 -maxdepth 1 -type d

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


1
Более старый вопрос, я знаю. В то время как я бы тоже сначала обратился к этой задаче, мне нравится ls -d -- */опция, так как я findтоже найду скрытые каталоги. Который иногда может быть полезным, но также иногда вызывает проблемы. Я надеюсь, что этот комментарий может помочь другим. +1
Матч

12
find . -maxdepth 1 -type d

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


5
Вы, вероятно, -maxdepth 1тоже хотите .
Тедди

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

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

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

0

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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.