Listando apenas diretórios no UNIX

219

Quero listar apenas os diretórios no caminho especificado ( lsnão tem essa opção). Além disso, isso pode ser feito com um comando de linha única?

S'am
fonte
12
Para o futuro: Talvez Unix / Linux básico tipo de perguntas não tão difícil relacionados à programação são melhores keept lá: unix.stackexchange.com
echox

Respostas:

315

Tente isso ls -d */para listar diretórios no diretório atual

David Hancock
fonte
17
Ei, isso é muito bacana, eu sempre usei para nós ls -al | grep '^d'- isso é muito mais sucinto.
paxdiablo
43
por que usar * / ?? Por favor explique!?
precisa saber é o seguinte
6
Não tenho uma explicação adequada, porém sei que isso */força a exibição de apenas itens que terminam com uma barra, que nesse caso seria um diretório, mesmo que a -Fopção de lsnão seja usada. Semelhante ao comportamento de ls *phpe como ele exibe todos os arquivos que terminam com phpem um diretório.
David Hancock
3
@ user975234 Alguém fez uma pergunta semelhante, e há uma explicação muito boa no link
user1766760
17
Apenas echo */fará o mesmo também
n °
95

Tente o seguinte:

find . -maxdepth 1 -type d
Robin
fonte
8
Para mim, isso parece ser o que deve ser feito. Diferentemente das lssoluções sugeridas , findé o único responsável por fazer o trabalho (sem depender da expansão de curinga do shell, que pode impor limites). Também é muito mais conciso.
Peterp
1
O ruim disso é que não funcionará se você estiver tentando fazer um loop pelos resultados e seus resultados tiverem espaços nos nomes.
Ubiquibacon
2
Alternativamente, se você não quiser incluir o diretório em si: find * -maxdepth 0 -type d.
James Ko
@ubiquibacon use finds' -print0ou -execopção.
1
Isso é muito lento, pelo menos no meu Mac. Parece para fazer a pesquisa completa recursiva que findnormalmente faz, mas apenas a saída das pastas em profundidade 1.
Kara Brightwell
22

Os seguintes

find * -maxdepth 0 -type d

basicamente filtra a expansão de '*', ou seja, todas as entradas no diretório atual, pela -type dcondição

A vantagem é que a saída é a mesma ls -1 *, mas apenas com diretórios e entradas não começam com um ponto

radiospiel
fonte
13

Você pode usar ls -d */outree -d

Outra solução seria globbing, mas isso depende do shell que você está usando e se o globbing para diretórios é suportado.

Por exemplo ZSH:

zsh # ls *(/)
eco
fonte
3
Com qual sabor do Unix você consegue tree?
Johnsyweb
todas as principais distrações de linux, por exemplo? desculpe, eu não entendi a pergunta?
Echox 8/09/10
1
Eu tenho uma distribuição Debian e treenão é instalado por padrão (embora esteja nos repositórios).
Stephen Schrauger
1
Votos negativos, pois acredito que o treecomando não é um comando unix nativo (por favor, corrija-me se estiver errado).
Tiago Cardoso
10

Como existem dezenas de maneiras de fazer isso, aqui está outra:

tree -d -L 1 -i --noreport
  • -d: diretórios
  • -L: profundidade da árvore (daí 1, nosso diretório de trabalho)
  • -i: sem recuo, apenas nomes de impressão
  • --noreport: não relata informações no final da lista de árvores
alleen1
fonte
E obrigado por explicar as opções. Stack Overflow é sobre respostas, eu sempre aprecio quando as pessoas gostam de você com uma explicação vs. "apenas leia a entrada do homem!" <- isso não é uma resposta.
fusion27
Para começar da linha 2 (pule a linha com apenas um ponto):tree -d -L 1 -i --noreport | tail -n +2
adius
Esta é a solução com a classificação mais alta que lista diretórios vinculados por software e o faz de maneira útil, expondo-os como um link. Eu prefiro a variação:tree -C -d -L 1 -i --noreport | tail -n+2
Amnon Harel
9
ls -l | grep '^d'

Você pode criar um alias e colocá-lo no arquivo de perfil

alias ld="ls -l| grep '^d'"
somesh chandra
fonte
1
os links não são visualizados com este comando. E um link pode ser um arquivo ou um diretório. Exemplo: lrwxrwxrwx 1 raiz raiz 21 de abril 15 17:38 cron -> / lib / init / upstart-job.
C-toesca
7
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'
mda
fonte
☀ encontrar. -maxdepth 1 -type d -name [^ \.] * | sed 's: ^ \ ./ ::' zsh: nenhuma correspondência encontrada: [^.] * #
Michael Cole
6

Para listar os diretórios no diretório de trabalho atual, ls -d */pode ser usado. E se você precisar listar os diretórios ocultos, use este comando ls -d .*/

kvivek
fonte
6

use isso para obter uma lista de diretórios

ls -d */ | sed -e "s/\///g"
Lakshmi
fonte
ls -d <caminho do diretório personalizado> | sed -e "s / \ /// g" não está funcionando ..ou pistas?
Dhwanit
Obrigado! Eu só queria a lista de diretórios sem todas as permissões e isso fez o truque. :)
codingjeremy
5

find specifiedpath -type d

Se você não quiser recursar em subdiretórios, faça o seguinte:

find specifiedpath -type d -mindepth 1 -maxdepth 1

Observe que os diretórios "ponto" (cujo nome começa com .) também serão listados; mas não os diretórios especiais .nem ... Se você não quiser diretórios "pontilhados", você pode grep:

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

DomQ
fonte
1
Voto a favor por mencionar mindepthcomo se livrar .! 😁
adius
5

A resposta vai depender do seu shell .

Por zshexemplo, você pode fazer o seguinte:

echo *(/)

E todos os diretórios no diretório de trabalho atual serão exibidos.

Veja man zshexpnpara mais informações.

Uma abordagem alternativa seria usar find(1), que deve funcionar na maioria dos tipos de Unix:

find . -maxdepth 1 -type d -print  

find(1)tem muitos usos, então eu definitivamente recomendo man find.

Johnsyweb
fonte
4

Você pode usar o treecomando com sua dopção para fazer isso.

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

6 directories

veja man treepara mais informações.

slm
fonte
Não diminuí o voto, apenas tive a mesma pergunta. Parece que sua resposta é uma bobagem de eco, talvez seja por isso?
Louis Waweru
1
@ Louis - obrigado, eu nunca notei sua menção tree. Oh, bem, não era minha intenção roubar o trovão de alguém.
SLM
upvoting para a visualização do que árvore faz
Andrejs
Eu acredito que os downvotes são porque é um a mesma resposta que stackoverflow.com/a/3667405/523742
Tiago Cardoso
@TiagoCardoso - o meu é anterior a um em dois anos.
SLM
2

Se eu tiver este diretório:

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

Para obter todos os diretórios, use -L para resolver os links:

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

Sem -L:

ls -l | grep '^d'

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

O diretório conf_nagios está ausente.

c-toesca
fonte
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*"
Surya
fonte
1

Isso tem funcionado para mim:

`ls -F | grep /`

(Mas, estou mudando para echo */como mencionado por @nos)

FractalSpace
fonte
1

Aqui está outra solução que mostra diretórios vinculados. Eu prefiro um pouco porque é um subconjunto da saída ls -l "normal":

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

Na festança:

ls -d */

Listará todos os diretórios

ls -ld */

listará todos os diretórios em formato longo

ls -ld */ .*/

listará todos os diretórios, incluindo diretórios ocultos, em formato longo.


Recentemente, mudei para zsh (MacOS Catalina) e descobri que:

ls -ld */ .*/

não funcionará mais se o diretório atual não contiver diretórios ocultos.

zsh: no matches found: .*/

Ele imprimirá o erro acima, mas também falhará ao imprimir os diretórios.

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

Também falha da mesma maneira.

Até agora eu descobri que isso:

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

é uma solução decente. O ;é um separador de comandos. Mas isso significa que, se não houver diretórios ocultos, ele listará os diretórios e ainda imprimirá o erro para nenhum diretório oculto:

foo
bar
zsh: no matches found: .*/

lsé o comando shell para o conteúdo da lista do diretório atual;
-lé o sinalizador para especificar que você deseja listar em Longford (um item por linha + várias outras informações interessantes)
-dé o sinalizador para listar todos os diretórios "como arquivos" e não
*/é recursivamente o argumento 'listar todos os arquivos que terminam em uma barra'
*é um simples comando regex para "qualquer coisa", assim */como solicitar ao shell que liste "qualquer coisa que termine em '/'"

Veja man lspara mais informações.


Eu coloquei isso:

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

no meu .zshrc, e parece funcionar bem.

NOTA: Também descobri que

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

não funciona, pois ainda imprime sterr no terminal. Atualizarei minha resposta se / quando encontrar uma solução.

DryLabRebel
fonte
0

du -d1é talvez a opção mais curta. (Desde que você não precise canalizar a entrada para outro comando.)

Mohan
fonte
0

Para listar apenas diretórios em um caminho especificado, basta digitar ls -l | grep drw

Loui
fonte
Isso pode incluir arquivos, se houver algum nome de arquivo drw, e excluiria todos os diretórios que não sejam legíveis pelo proprietário e graváveis. grep ^dfunciona melhor.
Tom Zych 29/09/19
0

Listagem longa de diretórios

  • ls -l | grep '^ d'
  • ls -l | grep "^ d"

Listando diretórios
- ls -d * /

Athi
fonte
Você tem algum bom motivo para duplicar respostas já existentes?
Maxim Sagaydachny 21/02