Quero listar apenas os diretórios no caminho especificado ( ls
não tem essa opção). Além disso, isso pode ser feito com um comando de linha única?
Quero listar apenas os diretórios no caminho especificado ( ls
não tem essa opção). Além disso, isso pode ser feito com um comando de linha única?
Respostas:
Tente isso ls -d */
para listar diretórios no diretório atual
ls -al | grep '^d'
- isso é muito mais sucinto.
*/
força a exibição de apenas itens que terminam com uma barra, que nesse caso seria um diretório, mesmo que a -F
opção de ls
não seja usada. Semelhante ao comportamento de ls *php
e como ele exibe todos os arquivos que terminam com php
em um diretório.
echo */
fará o mesmo também
Tente o seguinte:
find . -maxdepth 1 -type d
ls
soluçõ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.
find * -maxdepth 0 -type d
.
find
normalmente faz, mas apenas a saída das pastas em profundidade 1.
Os seguintes
find * -maxdepth 0 -type d
basicamente filtra a expansão de '*', ou seja, todas as entradas no diretório atual, pela -type d
condiçã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
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 *(/)
tree
?
tree
não é instalado por padrão (embora esteja nos repositórios).
tree
comando não é um comando unix nativo (por favor, corrija-me se estiver errado).
Como existem dezenas de maneiras de fazer isso, aqui está outra:
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'
Você pode criar um alias e colocá-lo no arquivo de perfil
alias ld="ls -l| grep '^d'"
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'
use isso para obter uma lista de diretórios
ls -d */ | sed -e "s/\///g"
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 '^\.'
mindepth
como se livrar .
! 😁
A resposta vai depender do seu shell .
Por zsh
exemplo, você pode fazer o seguinte:
echo *(/)
E todos os diretórios no diretório de trabalho atual serão exibidos.
Veja man zshexpn
para 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
.
Você pode usar o tree
comando com sua d
opção para fazer isso.
% tree -d tstdir
tstdir
|-- d1
| `-- d11
| `-- d111
`-- d2
`-- d21
`-- d211
6 directories
veja man tree
para mais informações.
tree
. Oh, bem, não era minha intenção roubar o trovão de alguém.
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.
Isso tem funcionado para mim:
`ls -F | grep /`
(Mas, estou mudando para echo */
como mencionado por @nos)
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
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 ls
para 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.
Para listar apenas diretórios em um caminho especificado, basta digitar ls -l | grep drw
drw
, e excluiria todos os diretórios que não sejam legíveis pelo proprietário e graváveis. grep ^d
funciona melhor.
Listagem longa de diretórios
Listando diretórios
- ls -d * /