Як перелічити папки за допомогою команд bash?


52

Чи є спосіб перерахувати лише папки в каталозі за допомогою команд bash? (оскільки lsкоманда перераховує всі файли та папки)

Відповіді:


66

Ви можете використовувати:

ls -d -- */

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


2
ls - * / перелічує всі каталоги з їх вмістом нижче
Vins

1
@ 8088 Яка різниця між ls -d -- */та ls -d */?
Луї-

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

28

Відповідь Стівена Мартіна надіслала попередження і також вказала поточну папку, тому я б запропонував

find . -mindepth 1 -maxdepth 1 -type d

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


1
Старіше питання я знаю. Хоча я б занадто спочатку звертався, щоб знайти це завдання, мені подобається ls -d -- */варіант, оскільки я findтеж знайду приховані режими. Що іноді може бути корисним, але також іноді викликає неприємності. Сподіваюся, цей коментар може допомогти іншим. +1
матч

12
find . -maxdepth 1 -type d

Буде вказано лише папки. І як Тедді зазначив, вам знадобиться -maxdepth, щоб зупинити його повторне втиснення в підпал


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 або знайти, ви можете спробувати відфільтрувати "*" за допомогою "[-d]".

Я зробив саме це, чомусь я знаю, що не працювали (я думаю, імена файлів з пробілами і дужками, я думаю, або щось інше, що я оглядав), тоді я щось робив за принципом

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.