Перелік лише каталогів у UNIX


219

Я хочу перелічити лише каталоги у вказаному шляху ( lsнемає такої опції). Також, чи можна це зробити за допомогою однорядкової команди?


12
На майбутнє: Можливо, основи unix / linux типу питань, не так важких, пов’язаних із програмуванням, краще зберігати там: unix.stackexchange.com
echox

Відповіді:


315

Спробуйте це ls -d */перерахувати каталоги в поточному каталозі


17
Гей, це чудово витончено, я завжди звик до нас ls -al | grep '^d'- це набагато більш лаконічно.
paxdiablo

43
навіщо використовувати * / ?? Будь ласка, поясніть!?
Chandeep

6
У мене немає належного пояснення, проте я знаю, що */примушує відображення лише елементів, що закінчуються косою рисою вперед, що в цьому випадку буде каталогом, навіть якщо -Fопція lsне використовується. Аналогічно поведінці ls *phpта тому, як він відображає всі файли, що закінчуються phpв каталозі.
Девід Хенкок

3
@ user975234 Хтось задав подібне запитання, і є досить хороше пояснення, розміщене посилання
користувач1766760

17
Просто echo */зробимо те ж саме
нос

95

Спробуйте це:

find . -maxdepth 1 -type d

8
Для мене це виглядає так, як це слід робити. На відміну від запропонованих lsрішень, findвін несе повну відповідальність за виконання цієї роботи (не покладаючись на розширення шаблону шаблону, що може встановити обмеження). Це також набагато більш стисло.
peterp

1
Погано в цьому полягає в тому, що він не працює, якщо ви намагаєтеся переглядати результати, а у ваших результатах пробіли у назвах.
ubiquibacon

2
З іншого боку , якщо ви не хочете включати в себе сам каталог: find * -maxdepth 0 -type d.
Джеймс Ко

@ubiquibacon використовувати або find«з -print0або -execваріант.

1
Це дійсно повільно, принаймні на моєму Mac. Схоже, виконується повний рекурсивний пошук, який findзазвичай робить, але лише виводить папки на глибину 1.
Кара Брайтвелл

22

Наступне

find * -maxdepth 0 -type d

в основному фільтрує розширення '*', тобто всі записи в поточному режимі, за -type dумовою.

Перевага полягає в тому, що вихід такий самий, як ls -1 *, але тільки з каталогів і записів не починається з крапки


13

Ви можете використовувати ls -d */абоtree -d

Іншим рішенням буде глобалізація, але це залежить від оболонки, яку ви використовуєте, і чи підтримується глобалізація для каталогів.

Наприклад, ZSH:

zsh # ls *(/)

3
З яким ароматом Unix ви отримуєте tree?
Johnsyweb

наприклад, усі основні Linux-файли? вибачте, я не розумію питання?
ехокс

1
У мене є дистрибутив Debian, і treeвін не встановлений за замовчуванням (хоча він є у сховищах).
Стівен Шраугер

1
Я вважаю, що treeкоманда не є рідною командою unix (будь ласка, виправте мене, якщо я помиляюся).
Тіаго Кардосо

10

Оскільки є десятки способів зробити це, ось ще один:

tree -d -L 1 -i --noreport
  • -d: каталоги
  • -L: глибина дерева (звідси 1, наш робочий каталог)
  • -i: немає відступів, друкуйте лише імена
  • --noreport: не повідомляйте інформацію в кінці списку дерев

І дякую за пояснення перемикачів. Переповнення стека - це відповіді, я завжди вдячний, коли люди так само, як і ви, пояснюють, що "просто читайте людину!" <- це не відповідь.
fusion27

Почніть з другого рядка (пропустіть лінію лише крапкою):tree -d -L 1 -i --noreport | tail -n +2
adius

Це рішення найвищого рейтингу, яке містить перелік каталогів з м'якими зв'язками і робить це корисним чином, викриваючи їх як посилання. Я віддаю перевагу варіації:tree -C -d -L 1 -i --noreport | tail -n+2
Амнон Харел

9
ls -l | grep '^d'

Ви можете зробити псевдонім і помістити його у файл профілю

alias ld="ls -l| grep '^d'"

1
посилання не переглядаються за допомогою цієї команди. І посиланням може бути файл або каталог. Приклад: lrwxrwxrwx 1 корінь кореня 21 квітня 15 17:38 cron -> / lib / init / upstart-job.
c-toesca

7
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'

☀ знайти. -maxdepth 1 -тип d -name [^ \.] * | sed 's: ^ \ ./ ::' zsh: не знайдено відповідностей: [^.] *
Michael Cole

6

Для переліку каталогів у поточному робочому каталозі ls -d */можна використовувати. І якщо вам потрібно перерахувати приховані каталоги, використовуйте цю команду ls -d .*/


6

скористайтеся цим для отримання списку каталогів

ls -d */ | sed -e "s/\///g"

ls -d <звичайний-директорія- шлях> | sed -e "s / \ /// g" не працює .. багато підказок?
Dhwanit

Дякую! Я просто хотів список каталогу без усіх дозволів, і це зробило свою справу. :)
codingjeremy

5

find specifiedpath -type d

Якщо ви не хочете повторювати в підкаталогах, можете зробити це замість цього:

find specifiedpath -type d -mindepth 1 -maxdepth 1

Зауважте, що .також будуть вказані каталоги "крапка" (назва яких починається з ); але не спеціальні каталоги .ні ... Якщо ви не хочете "крапкових" каталогів, ви можете просто grepїх випустити:

find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'


1
Резюме на згадку mindepthпро позбавлення .! 😁
adius

5

Відповідь буде залежати від вашої оболонки .

В zsh, наприклад, ви можете зробити наступне:

echo *(/)

І будуть показані всі каталоги в поточному робочому каталозі.

Див. Для man zshexpnотримання додаткової інформації.

Альтернативним підходом було б використання find(1), який повинен працювати на більшості ароматів Unix:

find . -maxdepth 1 -type d -print  

find(1)має багато застосувань, тому я точно рекомендую man find.


4

Для цього можна скористатися treeкомандою з її dперемикачем.

% tree -d tstdir
tstdir
|-- d1
|   `-- d11
|       `-- d111
`-- d2
    `-- d21
        `-- d211

6 directories

див. man treeдля отримання додаткової інформації.


Я не виступав із заявою, просто було те саме питання. Здається, ваша відповідь є дурнем ехокса, можливо, саме тому ?.
Луї Ваверу

1
@Louis - дякую, я ніколи навіть не помічав його згадки tree. Ну добре, чи не був мій намір вкрасти когось грому.
slm

наголосити на візуалізації того, що робить дерево
Андрейс

Я вважаю, що голосування є тим, що це та сама відповідь, що і stackoverflow.com/a/3667405/523742
Tiago Cardoso

@TiagoCardoso - мій передує цьому один за два роки.
slm

2

Якщо у мене є цей каталог:

ls -l

lrwxrwxrwx  1 nagios nagios     11 août   2 18:46 conf_nagios -> /etc/icinga
-rw-------  1 nagios nagios 724930 août  15 21:00 dead.letter
-rw-r--r--  1 nagios nagios  12312 août  23 00:13 icinga.log
-rw-r--r--  1 nagios nagios   8323 août  23 00:12 icinga.log.gz
drwxr-xr-x  2 nagios nagios   4096 août  23 16:36 tmp

Щоб отримати всі каталоги, використовуйте -L для вирішення посилань:

ls -lL | grep '^d'

drwxr-xr-x 5 nagios nagios   4096 août  15 21:22 conf_nagios
drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

Без -L:

ls -l | grep '^d'

drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

Каталог conf_nagios відсутній.


2
### If you need full path of dir and list selective dir with "name" of dir(or dir_prefix*):
find $(pwd) -maxdepth 1 -type d -name "SL*"

1

Це працює для мене:

`ls -F | grep /`

(Але я echo */переходжу до, як згадував @nos)


1

Ось ще одне рішення, яке показує пов'язані каталоги. Я трохи віддаю перевагу, тому що це підмножина "нормального" ls -l виводу:

ls -1d */ | rev | cut -c2- | rev | xargs ls -ld --color=always

1

У басі:

ls -d */

Буде перераховано всі каталоги

ls -ld */

перерахує всі каталоги у довгій формі

ls -ld */ .*/

перерахує всі каталоги, включаючи приховані каталоги, у довгій формі.


Нещодавно я перейшов на zsh (MacOS Catalina) і виявив, що:

ls -ld */ .*/

більше не працює, якщо поточний каталог не містить прихованих каталогів.

zsh: no matches found: .*/

Він надрукує вищезгадану помилку, але також не зможе надрукувати жодні каталоги.

ls -ld *(/) .*(/)

Також провалюється таким же чином.

Поки я виявив, що це:

ls -ld */;ls -ld .*/

є гідним способом вирішення. Це ;розділювач команд. Але це означає, що якщо немає прихованих каталогів, він буде перераховувати каталоги та все ж надрукувати помилку для відсутніх прихованих каталогів:

foo
bar
zsh: no matches found: .*/

lsце команда оболонки для вмісту списку поточного каталогу
-l- це прапор, щоб вказати, що потрібно перелічити в Лонгфорді (один елемент на рядок + купу іншої прохолодної інформації)
-d- це прапор для переліку всіх каталогів "як файли", а не рекурсивно
*/є аргумент "перерахувати всі файли, що закінчуються на косою рисою"
*- це проста команда регулярного вираження для "нічого", тому */просимо оболонку перерахувати "все, що закінчується на" / ""

Див. Для man lsотримання додаткової інформації.


Я ставлю це:

alias lad="ls -ld */;ls -ld .*/"

по-моєму .zshrc, і, здається, працює добре.

ПРИМІТКА: Я також це виявив

ls -ld .*/ 2> /dev/null

не працює, оскільки він все ще друкує sterr до терміналу. Я оновлю свою відповідь, якщо / коли знайду рішення.


0

du -d1є чи не найкоротшим варіантом. (Поки вам не потрібно передавати вхід іншій команді.)


0

Щоб перерахувати лише каталоги у вказаному шляху, просто введіть ls -l | греп дрю


Це може включати файли, якщо будь-які імена файлів включають drw, і буде виключати будь-які каталоги, які не можуть бути прочитані власником і не можуть бути записані. grep ^dпрацює краще.
Том

0

Довгий перелік каталогів

  • лс -л | grep '^ d'
  • лс -л | grep "^ d"

Каталоги лістингу
- ls -d * /


Чи є у вас якісь вагомі причини дублювати вже наявні відповіді?
Максим Сагайдачний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.