Como listar pastas no bash sem o trailing /

1

Eu sei

ls -d */

lista todas as pastas no diretório atual como dir1/ dir2/ dir3/ .

Existe a possibilidade de um script bash mostrar pastas como dir1 dir2 dir3 ?

    
por Wyatt_LandWalker 10.11.2013 / 12:18

4 respostas

4

Para obter apenas diretórios, mas omita a barra:

ls -d */ | sed 's#/##'

Ou você terá que usar algo como find . -type d -maxdepth 1 (mas isso introduz o ./ prefixing)

    
por 10.11.2013 / 12:22
4

Com find (isso também eliminará o ./ ou /path/to/ que normalmente seria adicionado ao usar find ):

find . -maxdepth 1 -type d -printf '%f\n'

O comando acima incluirá . e também dotfiles (que normalmente seriam ocultos). Para evitar todos os diretórios começando com um ponto (pelo menos com o GNU find):

find . -maxdepth 1 -type d ! -name '.*' -printf '%f\n'

Se você quiser ver diretórios ocultos, mas não quiser . , você pode usar (novamente, apenas testado no GNU find, YMMV com outras versões do find):

find . -maxdepth 1 -mindepth 1 -type d -printf '%f\n'

% purobash:

for f in */; do echo "${f%/}"; done

O seguinte é um pouco trapaceiro, já que ele realmente substitui o / por um espaço em branco (então não é muito útil em scripts, mas se tudo que você quer é uma saída um pouco mais bonita, você pode gostar):

printf '%s\b \n' */

Como alternativa, você pode usar zsh em vez de bash e aproveitar seus qualificadores da glob :

ls -d *(/)
    
por 10.11.2013 / 13:08
1

Você pode usar

ls -d */ | awk -F/ '{print$1}'

canaliza a saída ls para awk e diz para considerar o delimitador de campo / as e para imprimir apenas o primeiro campo

    
por 10.11.2013 / 12:27
1

A análise de saída de ls é realmente uma má ideia porque o formato de saída de ls não é garantido.

Aqui está uma solução que não precisa de ls e, portanto, não depende da formatação da ls :

echo */ | sed s#/##g

Infelizmente, o código acima não funcionará corretamente com nomes de diretório contendo espaços. Por isso, é melhor separar os itens da lista por novas linhas ou caracteres NULL. Não é fácil separar os argumentos por algo diferente de espaço sem iterá-los em um ciclo de shell.

Solução utilizando / para identificar onde a nova linha deve ser colocada:

echo -n */ | sed 's#/ \?#\n#g'

Solução que utiliza o separador de expansão de parâmetro alterado:

nsplit() { IFS=$'\n' ; echo "$*" | sed 's#/$##' ; } ; nsplit */
    
por 10.11.2013 / 13:01

Tags