Чи є якийсь варіант із командою 'ls', що я бачу лише каталоги?


73

Іноді мені потрібно перевіряти лише каталоги, а не файли. Чи є якийсь варіант із командою ls? Або є якась утиліта для цього?

EDIT : Я використовую Mac OS X, і ls -dдає мені, .навіть якщо у мене є каталоги.


4
Чи може хтось пояснити, чому ls -dдає лише .і чому */треба додавати її до кінця, щоб вона працювала?
cwd

3
@cwd Якщо ви не вказуєте жодних файлів, lsза замовчуванням .. І -dозначає не друкувати вміст каталогів, а надрукувати сам каталог.
Мікель

1
@cwd спробуйте використовувати ls -pйого, показує /назви каталогів після. Отже, */це лише зразок, який співставляється з назвою каталогу та /комбо.
Пітт

Я створив функцію, що реалізує відповідь @ Steven_D для мого файлу ~ / .bash_aliases: gist.github.com/rjurney/998f4951a57bfa5daeb9a6c18f6f4827
rjurney

Відповіді:


84

Я знаю, що вже є обрана відповідь, але ви можете отримати запитувану поведінку просто ls:

ls -ld -- */

(Зверніть увагу, що "-" позначає кінець параметрів, не дозволяючи іменам папок, що починаються з дефісу, не інтерпретуватися як інші параметри команд.)

Тут буде перераховано всі не приховані (якщо ви не налаштовуєте глобус вашої оболонки для їх розширення) каталоги в поточному робочому каталозі, де він запущений (зауважте, що він також включає символьні посилання на каталоги). Щоб отримати всі підкаталоги іншої папки, просто спробуйте:

ls -ld /path/to/directory/*/

Зауважте, що -l необов’язковий.


5
Приємно. Я ніколи не вважав, що каталоги мають неявне значення /в кінці, але тепер, коли бачу, як ти відповів, це має сенс. Зрештою, доповнення вкладки завжди додає його.
gvkv

-d for dir, -l for long format. яка мета --?
Дінешкумар

1
Хоча це виглядає коротко і працює в більшості випадків, можливо, не потрібно використовувати цей підхід, коли потрібна справжня директорія, а не посилання на каталог. Тож findнасправді вдалий вибір у такому випадку.
biocyberman

1
findтакож має перевагу, коли кількість каталогів перевищує максимальну довжину аргументу.
Стівен D

Працюючи в зворотному напрямку, я просто зрозумів , що ви можете просто ігнорувати все , що з розширенням: ls -alhF --ignore=*.*. Не впевнений, наскільки добре це обробляє «приховані» папки, тобто.myHiddenFolder
Timmah

14

Ні, але проста findкоманда виконає це:

find . -type d -depth 1

або grep

ls -F | grep /

Тоді ви можете створити псевдонім, якщо це необхідно.


6
На Ubuntu 14.04 це було -maxdepth 1. Також findхотів, щоб я перевернув наказ:find . -maxdepth 1 -type d
Брад Купіт

Це ls -F | grep /рішення творить чудеса! Це здається єдиним, кого я можу взяти на роботу на своїй машині FreeBSD. Я думаю, що використовувати Fish означає, що нічого з, */можливо, не вийде?
CJM

Я ніколи не працював з Fish, тому не впевнений у цьому, але варіант -F може творити чудеса.
gvkv

7

Мені подобається утиліта дерева , щоб отримати огляд структури каталогів. Він доступний у MacPorts та всіх дистрибутивах Linux, які я пробував.

tree -d -L 2

Це показало б усі каталоги, два рівні глибокі.


5

Мені також потрібно було переглядати приховані каталоги, щоб змінити пропозицію вище, щоб відповідати моїм потребам

ls -d -- */ .*/

(залежно від оболонки, яка може також включати .та ..)


2

З zsh(як це було встановлено за замовчуванням на macOS, він раніше навіть був /bin/shтам), ви б використовували глобальні кваліфікатори для вибору файлів залежно від їх типу:

  • Список неприхованих каталогів:

    ls -d -- *(/)
    
  • Список усіх каталогів:

    ls -d -- *(D/)
    

    ( .і ..завжди виключаються, додайте їх окремо, якщо ви хочете)

  • Також додайте посилання на каталоги:

    ls -d -- *(D-/)
    

    ( -змушує застосовувати подальші класифікатори після роздільної здатності символьної посилання).


-1

Я думаю, що у Ls є помилка на Mac OS X. Вирішення проблеми полягає у використанні grep ... ls -l / | grep "^d"


1
Приємно знати, що я не єдина людина, яка використовує grep "^d"хак
Michael Mrozek

6
Наскільки я знаю, поведінка, яку він описує, не є помилкою і є такою ж, якщо використовується GNU ls. Параметр -d відображає список для каталогу, а не вміст. Щоб зрозуміти, чому це може бути корисно, дивіться різницю між: ls -l /homeтаls -dl /home
Стівен Д

Карати не особливі для оболонки. Можна просто використовувати ls -l / | grep ^d. Якщо будуть збираєтеся використовувати лапки, так як вам не потрібно розширення параметрів, зробити їх поодинокі лапки. ls -l / | grep '^d'. Так, я педант. Але дійсно, зробіть це. :)
Wildcard

-1
$ ls -p | grep /

-pПрапор змусить lsдодати слеш ( "/") після кожного файлу , якщо цей файл є каталогом.


-2

Найпростіший спосіб - набрати наступну команду. Це працює на більшості платформ і версій UNIX та Linux. Ви можете пропустити, -Fякщо хочете, але аргумент додає / до кінця імені каталогу. -CАргумент захоплює тільки імена каталогів - всі вони в поточному каталозі. Якщо ви хочете бачити лише каталоги та підкаталоги в поточному шляху, просто додайте -Rаргумент ( ls -CFR).

# ls -CF
/dir1  /dir2  /dir3  /beaches  /Work  /Other 

1
У всіх lsреалізаціях, про які я знаю, і в специфікації POSIX ls, -Cце виводити в стовпці , а не пропускати файли без каталогу. У вашому прикладі, /друкуються перед іменами файлів, що жодна lsреалізація не робила б. З -F, /додається до імені файлів файлів каталогів.
Стефан Шазелас

Побачивши цю відповідь, я задумався: «Де це правда?» @ StéphaneChazelas та Jeff Schaller - чи не оскаржуєте явно неправильних відповідей?
G-Man

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