*/é um padrão que corresponde a todos os subdiretórios no diretório atual ( *corresponderia a todos os arquivos e subdiretórios; o /restringe a diretórios). Da mesma forma, para listar todos os subdiretórios em / home / alice / Documents, usels -d /home/alice/Documents/*/
Observe que */não corresponderá a nenhuma pasta oculta. Para incluí-los, especifique-os explicitamente como ls -d .*/ */ou defina a dotglobopção no Bash.
Gergő 11/01
1
@ytpillai Isso está acontecendo porque não há subdiretórios para listar. Você recebe esse erro sempre que usa lsalgo que não existe.
Gordon Davisson
1
Tudo bem, obrigado, eu verifiquei isso agora e acontece que o único diretório é a pasta raiz.
Ytpillai
1
@GordonDavisson A mensagem de falha pode ser evitada com a opção bashshopt -s nullglob
4
@BinaryZebra Setting nullglob evitaria a mensagem de erro, mas causaria ainda mais confusão: com o nullglob set e sem subdiretórios, ls */seria expandido para apenas ls, o que listaria todos os arquivos no diretório atual. Tenho certeza de que não é o que você deseja nesse caso.
Gordon Davisson
481
Quatro maneiras de fazer isso, cada uma com um formato de saída diferente
1. Usando echo
Exemplo: echo */, echo */*/
Aqui está o que eu tenho:
NB 3foi visivelmente mais lento que os outros para mim. No diretório que testei: 1.012s, 2.016s, 3.055s , 4.021s.
Isomorphismes
@isomorphismes, como você mediu o tempo? Pelo que significa? By the way, eu tenho que dizer, não. 1É o meu favorito.
Albert Albert
Albert, eu usei time, a função Unix. /// Eu concordo, echo */é mais esperto que ls -d */.
Isomorphismes
9
Duas pequenas coisas que você deve observar. ls -l | grep "^ d" filtra links simbólicos para diretórios, enquanto 'ls -d * /' os exibe. Além disso, 'ls -d * /' falha se não houver diretórios presentes no diretório de destino.
Zoran Pavlovic
15
A 1.opção causará grandes problemas ao lidar com nomes de pastas que possuem espaços.
Shrikant Sharat
99
Eu uso:
ls -d */| cut -f1 -d'/'
Isso cria uma única coluna sem barra à direita - útil em scripts.
Para corresponder à pergunta (mas incluir arquivos de ponto), o primeiro deve ser: find /home/alice/Documents -maxdepth 1 -mindepth 1 -type dcaso contrário, você se inclui /home/alice/Documents. Para incluir links simbólicos para diretórios, prefixe com-L
jhnc 20/02/19
Essa parece ser a solução mais sadia, já que find é a ferramenta que realmente é feita para esta tarefa. Você pode excluir o primeiro resultado - ./ do diretório atual - canalizando para grep -v '^ \ ./$'
siliconrockstar
38
4 (mais) Opções confiáveis.
Um asterisco não citado* será interpretado como um padrão (glob) pelo shell. O shell o utilizará na expansão do nome do caminho. Ele irá gerar uma lista de nomes de arquivos que correspondem ao padrão. Um asterisco simples corresponderá a todos os nomes de arquivos no PWD (atual diretório de trabalho). Um padrão mais complexo, pois */corresponderá a todos os nomes de arquivos que terminam em /. Assim, todos os diretórios. É por isso que o comando:
1.- eco.
echo */
echo ./*/### avoid misinterpreting filenames like "-e dir"
será expandido (pelo shell) para echotodos os diretórios no PWD.
Para testar isso: Crie um diretório ( mkdir) chamado como test-dir e cdnele:
mkdir test-dir; cd test-dir
Crie alguns diretórios:
mkdir {cs,files,masters,draft,static}# safe directories.
mkdir {*,-,--,-v\ var,-h,-n,dir\ with\ spaces}# some a bit less secure.
touch --'file with spaces''-a''-l''filename'# and some files:
O comando echo ./*/permanecerá confiável, mesmo com arquivos com nomes ímpares:
./--/./-/./*/./cs/./dir with spaces/./draft/./files/./-h/./masters/./-n/./static/./-v var/
Mas os espaços nos nomes de arquivos tornam a leitura um pouco confusa.
Se em vez de echousarmos ls, o shell ainda é o que está expandindo a lista de nomes de arquivos. O shell é o motivo para obter uma lista de diretórios no PWD. A -dopção para lslistar a entrada atual do diretório em vez do conteúdo de cada diretório (como apresentado por padrão).
ls -d */
No entanto, este comando é (um pouco) menos confiável. Ele falhará com os arquivos nomeados ímpares listados acima. Vai sufocar com vários nomes. Você precisa apagar um por um até encontrar aqueles com problemas.
2.- ls
O GNU lsaceitará a --tecla "fim das opções" ( ).
ls -d ./*/### more reliable BSD ls
ls -d --*/### more reliable GNU ls
3.-printf
Para listar cada diretório em sua própria linha (em uma coluna, semelhante a ls -1), use:
$ printf "%s\n"*/### Correct even with "-", spaces or newlines.
E, melhor ainda, podemos remover o final /:
$ set--*/; printf "%s\n""${@%/}"### Correct with spaces and newlines.
Uma tentativa como esta:
$ for i in $(ls -d */);do echo ${i%%/};done
Irá falhar:
alguns nomes ( ls -d */) como já mostrado acima.
será afetado pelo valor de IFS.
dividirá nomes em espaços e guias (com padrão IFS).
cada nova linha no nome iniciará um novo comando de eco.
4.- Função
Finalmente, o uso da lista de argumentos dentro de uma função não afetará a lista de argumentos do atual shell em execução. Simplesmente:
Eu acho que você deve substituir a palavra Seguro por Confiável. O envio da mensagem me faz pensar que as outras soluções são 'inseguros' (vulneráveis ou explorável.)
Amado Martinez
1
@AmadoMartinez Feito um s geral / seguro / confiável /. Melhor?
21
O treecomando também é bastante útil aqui. Por padrão, ele mostrará todos os arquivos e diretórios em uma profundidade completa, com alguns caracteres ascii mostrando a árvore de diretórios.
Mas se quisermos obter apenas os diretórios, sem a árvore ascii e com o caminho completo do diretório atual, você poderá:
$ tree -dfi
../data
./data/sql
./images
Os argumentos são:
-d List directories only.-f Prints the full path prefix for each file.-i Makes tree not print the indentation lines, useful when used in conjunction with the -f option.
E se você quiser o caminho absoluto, poderá começar especificando o caminho completo para o diretório atual:
$ tree -dfi "$(pwd)"/home/alice/Documents/home/alice/Documents/data
/home/alice/Documents/data/sql
/home/alice/Documents/images
E para limitar o número de subdiretórios, você pode definir o nível máximo de subdiretórios com -L level, por exemplo:
$ tree -dfi -L 1"$(pwd)"/home/alice/Documents/home/alice/Documents/data
/home/alice/Documents/images
Caso você esteja se perguntando por que a saída de 'ls -d * /' fornece duas barras finais, como:
[prompt]$ ls -d */
app// cgi-bin// lib// pub//
provavelmente é porque em algum lugar seus arquivos de configuração de shell ou sessão alias o comando ls para uma versão de ls que inclui o sinalizador -F. Esse sinalizador acrescenta um caractere a cada nome de saída (que não é um arquivo simples) indicando o tipo de coisa que é. Portanto, uma barra é a que corresponde ao padrão '* /' e a outra barra é o indicador de tipo anexado.
Para se livrar desse problema, é claro que você pode definir um alias diferente para ls. No entanto, para não invocar temporariamente o alias, você pode preceder o comando com barra invertida:
Você não poderia simplesmente usar? caminho ls -l | grep dr
jrobertsz66 /
5
"o lsd produzirá o resultado desejado." Eu ri
fbafelipe
1
Na minha experiência, produz um resultado.
Todd
Eu uso 'lad' (lista todos os diretórios) e também incluí '. * /' Para incluir diretórios ocultos também. Claro, a insinuação também não está perdida para mim.
DryLabRebel 5/19/19
11
lsSolução real , incluindo links simbólicos para diretórios
Muitas respostas aqui não são realmente usadas ls(ou apenas são usadas no sentido trivial de ls -d, enquanto se usam curingas para a correspondência de subdiretório real. Uma lssolução verdadeira é útil, pois permite o uso de lsopções para ordem de classificação, etc.
Excluindo links simbólicos
Uma solução lsfoi fornecida, mas faz algo diferente das outras soluções, na medida em que exclui links simbólicos para diretórios:
ls -l | grep '^d'
(possivelmente canalizando sedou awkisolando os nomes dos arquivos)
Incluindo links simbólicos
No caso (provavelmente mais comum) em que links simbólicos para diretórios devem ser incluídos, podemos usar a -popção de ls, o que o faz anexar um caractere de barra aos nomes dos diretórios (incluindo links simbólicos):
ls -1p| grep '/$'
ou, eliminando as barras finais:
ls -1p| grep '/$'| sed 's/\/$//'
Podemos adicionar opções lsconforme necessário (se uma lista longa for usada, ela -1não será mais necessária).
note: se queremos barras invertidas, mas não as destacamos grep, podemos removê-las de maneira hackeada, deixando vazia a parte correspondente da linha:
Por favor, explique o que esse código faz e como ele se relaciona com a pergunta.
Ken YN
1
ele é executado teh comando 'ls', em seguida, percorre a saída do teste-ing, se cada um é um diretório e eco-ing se é .. obras, mas há melhores maneiras
cadarço
3
*/ é um padrão de correspondência de nome de arquivo que corresponde aos diretórios no diretório atual.
Para listar apenas diretórios, eu gosto desta função:
# long list only directories
llod (){
ls -l --color=always "$@"| grep --color=never '^d'}
Coloque-o no seu .bashrc.
Exemplos de uso:
llod # long listing of all directories in current directory
llod -tr # same but in chronological order oldest first
llod -d a*# limit to directories beginning with letter 'a'
llod -d .*# limit to hidden directories
NOTA: ele será quebrado se você usar a -iopção. Aqui está uma correção para isso:
# long list only directories
llod (){
ls -l --color=always "$@"| egrep --color=never '^d|^[[:digit:]]+ d'}
Para sua informação, se você quiser imprimir todos os arquivos em várias linhas, poderá fazer um ls -1para imprimir cada arquivo em uma linha separada. arquivo1 arquivo2 arquivo3
cd "/path/to/pricipal/folder"for i in $(ls -d .*/);do sudo ln -s "$PWD"/${i%%/}/home/inukaze/${i%%/};done
ln:«/home/inukaze/./.»: can't overwrite a directory
ln: «/home/inukaze/../..»: can't overwrite a directory
ln: accesing to «/home/inukaze/.config»: too much symbolics links levels
ln: accesing to «/home/inukaze/.disruptive»: too much symbolics links levels
ln: accesing to «/home/inukaze/innovations»: too much symbolics links levels
ln: accesing to «/home/inukaze/sarl»: too much symbolics links levels
ln: accesing to «/home/inukaze/.e_old»: too much symbolics links levels
ln: accesing to «/home/inukaze/.gnome2_private»: too much symbolics links levels
ln: accesing to «/home/inukaze/.gvfs»: too much symbolics links levels
ln: accesing to «/home/inukaze/.kde»: too much symbolics links levels
ln: accesing to «/home/inukaze/.local»: too much symbolics links levels
ln: accesing to «/home/inukaze/.xVideoServiceThief»: too much symbolics links levels
Acrescentando para torná-lo um círculo completo, para recuperar o caminho de cada pasta, use uma combinação da resposta de Albert e de Gordans que devem ser bastante úteis.
for i in $(ls -d /pathto/parent/folder/*/);do echo ${i%%/};done
A saída acima pode ser mais refinada usando o corte.
file *|grep directory|cut -d':'-f1
mongo-example-master
nostarch
scriptzz
splunk
testdir
* could be replaced with any path that's permitted
file - determine file type
grep - searches for string named directory
-d - to specify a field delimiter
-f1 - denotes field 1
O comando mais curto de todos os tempos (na verdade, um hack) para listar apenas diretórios. Digite o caminho absoluto ou o caminho relativo do diretório de interesse e pressione Enter para inserir o diretório de interesse. Agora digite cde pressione a tecla Tab . Somente os diretórios são mostrados agora.
user@ubuntu:~/Desktop$cd <tab key>
O comando acima agora deve exibir apenas pastas na área de trabalho . Menor, de fato.
Isso pressupõe que o preenchimento automático está ativado e pode não funcionar em todos os casos. Além disso, se você quiser fazer algo com isso, como canalizar a saída para algo, não funcionará. Mas, apenas vendo a saída, com certeza funciona rápido e fácil.
-d
realmente significa.Respostas:
*/
é um padrão que corresponde a todos os subdiretórios no diretório atual (*
corresponderia a todos os arquivos e subdiretórios; o/
restringe a diretórios). Da mesma forma, para listar todos os subdiretórios em / home / alice / Documents, usels -d /home/alice/Documents/*/
fonte
*/
não corresponderá a nenhuma pasta oculta. Para incluí-los, especifique-os explicitamente comols -d .*/ */
ou defina adotglob
opção no Bash.ls
algo que não existe.shopt -s nullglob
ls */
seria expandido para apenasls
, o que listaria todos os arquivos no diretório atual. Tenho certeza de que não é o que você deseja nesse caso.Quatro maneiras de fazer isso, cada uma com um formato de saída diferente
1. Usando
echo
Exemplo:
echo */
,echo */*/
Aqui está o que eu tenho:
2. Usando
ls
apenasExemplo:
ls -d */
Aqui está exatamente o que eu recebi:
Ou como lista (com informações detalhadas):
ls -dl */
3. Usando
ls
egrep
Exemplo:
ls -l | grep "^d"
Aqui está o que eu tenho:4. Script Bash (não recomendado para nome de arquivo que contém espaços)
Exemplo:
for i in $(ls -d */); do echo ${i%%/}; done
Aqui está o que eu tenho:
Se você gostaria de ter '/' como caractere final, o comando será:
for i in $(ls -d */); do echo ${i}; done
fonte
3
foi visivelmente mais lento que os outros para mim. No diretório que testei:1
.012s,2
.016s,3
.055s ,4
.021s.1
É o meu favorito.time
, a função Unix. /// Eu concordo,echo */
é mais esperto quels -d */
.1.
opção causará grandes problemas ao lidar com nomes de pastas que possuem espaços.Eu uso:
Isso cria uma única coluna sem barra à direita - útil em scripts.
Meus dois centavos.
fonte
-1
opção for tambémls
será impressa em formato de coluna única, como emls -1 -d */
.-1
ainda gera uma barra final para cada entrada..bashrc
como alias, como adiciono'/'
?'\/'
| sed -e 's-/$--'
Para todas as pastas sem subpastas:
Para todas as pastas com subpastas:
fonte
find /home/alice/Documents -maxdepth 1 -mindepth 1 -type d
caso contrário, você se inclui/home/alice/Documents
. Para incluir links simbólicos para diretórios, prefixe com-L
4 (mais) Opções confiáveis.
Um asterisco não citado
*
será interpretado como um padrão (glob) pelo shell.O shell o utilizará na expansão do nome do caminho.
Ele irá gerar uma lista de nomes de arquivos que correspondem ao padrão.
Um asterisco simples corresponderá a todos os nomes de arquivos no PWD (atual diretório de trabalho).
Um padrão mais complexo, pois
*/
corresponderá a todos os nomes de arquivos que terminam em/
.Assim, todos os diretórios. É por isso que o comando:
1.- eco.
será expandido (pelo shell) para
echo
todos os diretórios no PWD.Para testar isso: Crie um diretório (
mkdir
) chamado como test-dir ecd
nele:Crie alguns diretórios:
O comando
echo ./*/
permanecerá confiável, mesmo com arquivos com nomes ímpares:Mas os espaços nos nomes de arquivos tornam a leitura um pouco confusa.
Se em vez de
echo
usarmosls
, o shell ainda é o que está expandindo a lista de nomes de arquivos. O shell é o motivo para obter uma lista de diretórios no PWD. A-d
opção parals
listar a entrada atual do diretório em vez do conteúdo de cada diretório (como apresentado por padrão).No entanto, este comando é (um pouco) menos confiável. Ele falhará com os arquivos nomeados ímpares listados acima. Vai sufocar com vários nomes. Você precisa apagar um por um até encontrar aqueles com problemas.
2.- ls
O GNU
ls
aceitará a--
tecla "fim das opções" ( ).3.-printf
Para listar cada diretório em sua própria linha (em uma coluna, semelhante a ls -1), use:
E, melhor ainda, podemos remover o final
/
:Uma tentativa como esta:
Irá falhar:
ls -d */
) como já mostrado acima.IFS
.IFS
).4.- Função
Finalmente, o uso da lista de argumentos dentro de uma função não afetará a lista de argumentos do atual shell em execução. Simplesmente:
apresenta esta lista:
Essas opções são seguras com vários tipos de nomes de arquivos ímpares.
fonte
O
tree
comando também é bastante útil aqui. Por padrão, ele mostrará todos os arquivos e diretórios em uma profundidade completa, com alguns caracteres ascii mostrando a árvore de diretórios.Mas se quisermos obter apenas os diretórios, sem a árvore ascii e com o caminho completo do diretório atual, você poderá:
Os argumentos são:
E se você quiser o caminho absoluto, poderá começar especificando o caminho completo para o diretório atual:
E para limitar o número de subdiretórios, você pode definir o nível máximo de subdiretórios com
-L level
, por exemplo:Mais argumentos podem ser vistos com a árvore do homem
fonte
Caso você esteja se perguntando por que a saída de 'ls -d * /' fornece duas barras finais, como:
provavelmente é porque em algum lugar seus arquivos de configuração de shell ou sessão alias o comando ls para uma versão de ls que inclui o sinalizador -F. Esse sinalizador acrescenta um caractere a cada nome de saída (que não é um arquivo simples) indicando o tipo de coisa que é. Portanto, uma barra é a que corresponde ao padrão '* /' e a outra barra é o indicador de tipo anexado.
Para se livrar desse problema, é claro que você pode definir um alias diferente para ls. No entanto, para não invocar temporariamente o alias, você pode preceder o comando com barra invertida:
\ ls -d * /
fonte
Acabei de adicionar isso ao meu
.bashrc
arquivo (você também pode digitá-lo na linha de comando se precisar / desejar apenas para uma sessão)então lsd produzirá o resultado desejado.
fonte
ls
Solução real , incluindo links simbólicos para diretóriosMuitas respostas aqui não são realmente usadas
ls
(ou apenas são usadas no sentido trivial dels -d
, enquanto se usam curingas para a correspondência de subdiretório real. Umals
solução verdadeira é útil, pois permite o uso dels
opções para ordem de classificação, etc.Excluindo links simbólicos
Uma solução
ls
foi fornecida, mas faz algo diferente das outras soluções, na medida em que exclui links simbólicos para diretórios:(possivelmente canalizando
sed
ouawk
isolando os nomes dos arquivos)Incluindo links simbólicos
No caso (provavelmente mais comum) em que links simbólicos para diretórios devem ser incluídos, podemos usar a
-p
opção dels
, o que o faz anexar um caractere de barra aos nomes dos diretórios (incluindo links simbólicos):ou, eliminando as barras finais:
Podemos adicionar opções
ls
conforme necessário (se uma lista longa for usada, ela-1
não será mais necessária).note: se queremos barras invertidas, mas não as destacamos
grep
, podemos removê-las de maneira hackeada, deixando vazia a parte correspondente da linha:fonte
Se não for necessário listar o diretório oculto, ofereço:
E se for necessário listar diretórios ocultos, use:
OU
fonte
awk
, por favor, veja esta respostapara mostrar listas de pastas sem
/
fonte
ls -d1 */ | tr -d "/"
set -- */; printf "%s\n" "${@%/}"
Aqui está o que eu estou usando
ls -d1 /Directory/Path/*;
fonte
ls -d1 /Directory/Path/*/
Para listar apenas diretórios :
para listar apenas arquivos :
ou também você pode fazer como: ls -ld * /
fonte
Teste se o item é um diretório com
test -d
:fonte
*/
é um padrão de correspondência de nome de arquivo que corresponde aos diretórios no diretório atual.Para listar apenas diretórios, eu gosto desta função:
Coloque-o no seu .bashrc.
Exemplos de uso:
NOTA: ele será quebrado se você usar a
-i
opção. Aqui está uma correção para isso:fonte
Para sua informação, se você quiser imprimir todos os arquivos em várias linhas, poderá fazer um
ls -1
para imprimir cada arquivo em uma linha separada. arquivo1 arquivo2 arquivo3fonte
Uma lista simples do diretório atual, seria:
Deseja que ele seja limpo e organizado?
fonte
Tente este. Funciona para todas as distribuições linux.
fonte
ls -l | grep '^d' | awk '{print $9}'
Uma linha para listar diretórios apenas a partir de "aqui".
Com contagem de arquivos.
fonte
Resolvi parcialmente com:
Bem, isso me reduz a parte do prefeito :)
fonte
Acrescentando para torná-lo um círculo completo, para recuperar o caminho de cada pasta, use uma combinação da resposta de Albert e de Gordans que devem ser bastante úteis.
Resultado:
fonte
Usando Perl:
fonte
Aqui está o que eu uso para listar apenas nomes de diretório:
fonte
Para responder à pergunta original,
*/
nada tem a ver com issols
; é feito pelo shell / Bash, em um processo conhecido como globbing .É por isso que
echo */
els -d */
produz os mesmos elementos. (O-d
sinalizadorls
cria os nomes dos diretórios e não o conteúdo dos diretórios.)fonte
Aqui está uma variação usando a árvore que gera nomes de diretório apenas em linhas separadas; sim, é feio, mas, ei, funciona.
ou com awk
Provavelmente, isso é melhor e manterá o
/
nome do diretório posterior.fonte
O / P (na minha máquina) -
A saída acima pode ser mais refinada usando o corte.
fonte
O comando mais curto de todos os tempos (na verdade, um hack) para listar apenas diretórios. Digite o caminho absoluto ou o caminho relativo do diretório de interesse e pressione Enter para inserir o diretório de interesse. Agora digite
cd
e pressione a tecla Tab . Somente os diretórios são mostrados agora.user@ubuntu:~/Desktop$cd <tab key>
O comando acima agora deve exibir apenas pastas na área de trabalho . Menor, de fato.
fonte