Я хочу перелічити лише каталоги у вказаному шляху ( lsнемає такої опції). Також, чи можна це зробити за допомогою однорядкової команди?
Я хочу перелічити лише каталоги у вказаному шляху ( lsнемає такої опції). Також, чи можна це зробити за допомогою однорядкової команди?
Відповіді:
Спробуйте це ls -d */перерахувати каталоги в поточному каталозі
ls -al | grep '^d'- це набагато більш лаконічно.
*/примушує відображення лише елементів, що закінчуються косою рисою вперед, що в цьому випадку буде каталогом, навіть якщо -Fопція lsне використовується. Аналогічно поведінці ls *phpта тому, як він відображає всі файли, що закінчуються phpв каталозі.
echo */зробимо те ж саме
Спробуйте це:
find . -maxdepth 1 -type d
lsрішень, findвін несе повну відповідальність за виконання цієї роботи (не покладаючись на розширення шаблону шаблону, що може встановити обмеження). Це також набагато більш стисло.
find * -maxdepth 0 -type d.
findзазвичай робить, але лише виводить папки на глибину 1.
Наступне
find * -maxdepth 0 -type d
в основному фільтрує розширення '*', тобто всі записи в поточному режимі, за -type dумовою.
Перевага полягає в тому, що вихід такий самий, як ls -1 *, але тільки з каталогів і записів не починається з крапки
Ви можете використовувати ls -d */абоtree -d
Іншим рішенням буде глобалізація, але це залежить від оболонки, яку ви використовуєте, і чи підтримується глобалізація для каталогів.
Наприклад, ZSH:
zsh # ls *(/)
tree?
treeвін не встановлений за замовчуванням (хоча він є у сховищах).
treeкоманда не є рідною командою unix (будь ласка, виправте мене, якщо я помиляюся).
Оскільки є десятки способів зробити це, ось ще один:
tree -d -L 1 -i --noreport
tree -d -L 1 -i --noreport | tail -n +2
tree -C -d -L 1 -i --noreport | tail -n+2
ls -l | grep '^d'
Ви можете зробити псевдонім і помістити його у файл профілю
alias ld="ls -l| grep '^d'"
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'
скористайтеся цим для отримання списку каталогів
ls -d */ | sed -e "s/\///g"
find specifiedpath -type d
Якщо ви не хочете повторювати в підкаталогах, можете зробити це замість цього:
find specifiedpath -type d -mindepth 1 -maxdepth 1
Зауважте, що .також будуть вказані каталоги "крапка" (назва яких починається з ); але не спеціальні каталоги .ні ... Якщо ви не хочете "крапкових" каталогів, ви можете просто grepїх випустити:
find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'
mindepthпро позбавлення .! 😁
Відповідь буде залежати від вашої оболонки .
В zsh, наприклад, ви можете зробити наступне:
echo *(/)
І будуть показані всі каталоги в поточному робочому каталозі.
Див. Для man zshexpnотримання додаткової інформації.
Альтернативним підходом було б використання find(1), який повинен працювати на більшості ароматів Unix:
find . -maxdepth 1 -type d -print
find(1)має багато застосувань, тому я точно рекомендую man find.
Для цього можна скористатися treeкомандою з її dперемикачем.
% tree -d tstdir
tstdir
|-- d1
| `-- d11
| `-- d111
`-- d2
`-- d21
`-- d211
6 directories
див. man treeдля отримання додаткової інформації.
tree. Ну добре, чи не був мій намір вкрасти когось грому.
Якщо у мене є цей каталог:
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 відсутній.
Це працює для мене:
`ls -F | grep /`
(Але я echo */переходжу до, як згадував @nos)
Ось ще одне рішення, яке показує пов'язані каталоги. Я трохи віддаю перевагу, тому що це підмножина "нормального" ls -l виводу:
ls -1d */ | rev | cut -c2- | rev | xargs ls -ld --color=always
У басі:
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 до терміналу. Я оновлю свою відповідь, якщо / коли знайду рішення.
Довгий перелік каталогів
Каталоги лістингу
- ls -d * /