ls argumento do diretório de listagem não funciona como esperado [duplicado]

2

Desejo listar todos os diretórios somente (não arquivos) no meu diretório atual. Eu esperava que ls -ld ./* retornasse apenas diretórios como estados de página de manual

list directories and not contents

Atualmente, o comando retorna todos os arquivos e diretórios no diretório atual.

Alternativamente, eu tenho o comando abaixo, que pode alcançar minha exigência, mas eu estava pensando se havia uma opção inata para alcançar o mesmo

ls -lF ./ | grep ".*/$"
    
por LoveWithMaths 04.06.2018 / 20:11

3 respostas

3

Enquanto o sinalizador -d impede que ls desça para diretórios, isso é exatamente o que ele faz. Isso não significa listar apenas diretórios. Há uma diferença sutil entre essas duas instruções, se você executar ls -d some_file , então ls mostrará some_file . Como você está usando o shell globbing ( ./* ), esse glob está se expandindo para incluir os arquivos no diretório atual, bem como os diretórios no diretório atual. Como o shell é o que executa globbing e expansão, e não ls , o ls está recebendo uma lista de arquivos.

Para contornar isso, você precisa garantir que o shell glob não inclua arquivos regulares. Você pode fazer isso usando um / à direita no glob. Como / é um caractere especial proibido em nomes de arquivo, mas que denota a separação entre diretórios, você pode usá-lo para corresponder apenas aos diretórios.

Então, por exemplo:

ls -d */
    
por 04.06.2018 / 20:33
2

Isso pode depender do seu shell.

A maioria dos shells compatíveis com POSIX lista apenas diretórios se você acrescentar uma barra à estrela:

echo */

Então, se você ligar:

ls -l */

você recebe o tipo de listagem que espera.

Se você não gosta de ver o conteúdo dos diretórios, ligue:

ls -ld */
    
por 04.06.2018 / 20:21
0

Basicamente, minha confusão foi por que ls -ld ./* dint retornou apenas dirs. ls argumento espera um dir para o qual você deseja listar. E desde que o argumento */ foi avaliado pelo shell para todos os arquivos e diretórios (por causa do caractere curinga); Tudo foi listado, incluindo os arquivos no subdiretório. A solução sugerida por muitos de vocês foi ls -ld */ ; o curinga aqui foi expandido apenas para diretórios e excluiu os arquivos.

    
por 04.06.2018 / 20:39