Я хочу перечислить только каталоги по указанному пути ( 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
Обратите внимание, что каталоги "dot" (чье имя начинается с .
) тоже будут перечислены; но не специальные каталоги, .
ни ..
. Если вам не нужны «точечные» каталоги, вы можете просто grep
их извлечь:
find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'
mindepth
чтобы избавиться от .
! Ad
Ответ будет зависеть от вашей оболочки .
В 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 * /