Obtenha uma lista de nomes de diretório com find

26

Eu sei que posso fazer isso para obter uma lista de nomes de diretório:

find . -type d -maxdepth 1 

A saída é assim:

.
./foo
./bar

Eu prefiro a listagem sem ./ . Existe uma maneira de obter uma saída apenas para os nomes brutos?

Eu tentei enviar a lista para stat para formatá-la, mas isso me dá o mesmo resultado:

find . -type d -maxdepth 1 -print0 | xargs -0 stat -f '%N'
    
por joachim 24.08.2012 / 15:15

8 respostas

32

Com o GNU find , você pode usar a opção -printf :

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

Como observado por Paweł nos comentários, se você não quiser que o diretório atual seja listado, adicione -mindepth 1 , por exemplo:

find . -mindepth 1 -maxdepth 1 -type d -printf '%f\n'
    
por 24.08.2012 / 16:59
16

Atualização:

Uma alternativa mais curta:

 find . -maxdepth 1 -type d | cut -c 3-

Irá dar-lhe os nomes, um por linha, sem quaisquer barras

    
por 24.08.2012 / 15:20
8

Usando o GNU find, você pode usar -mindepth para impedir que o find coincida com o diretório atual:

find . -type d -maxdepth 1 -mindepth 1

Como você não está fazendo isso recursivamente, você pode usar um bash glob:

echo */

Adicionar um trailing / a um glob fará com que apenas diretórios sejam correspondidos.

    
por 24.08.2012 / 18:14
6

Deixar sed remover esses dois caracteres:

find . -maxdepth 1 -type d | sed -e 's/^\.\///'
    
por 24.08.2012 / 15:23
4

Eu prefiro usar:

 find ./ -type d -maxdepth 1 -exec basename {} \;
    
por 23.08.2013 / 10:30
2

Eu costumo usar:

find * -type d

Mas não sei se é o jeito certo de fazer o que você quer.

    
por 24.08.2012 / 16:18
0

No AIX, o parâmetro 'maxdepth' não funciona.

Em geral, isso funciona para mim:

find ./ -type d | cut -d"/" -f2 | sort -u

    
por 03.02.2017 / 12:47
0

O que você está procurando é chamado basename , ele ignora a estrutura de diretório unix

Exemplo abaixo:

find /any/path/you/want -maxdepth 1 -type d -exec basename {} \;

ele excluirá a saída até mesmo o caminho do diretório, removendo a necessidade de cd antes de executar o comando

Algumas informações adicionais:

Eu passaria -exec como argumento para encontrar | (pipe) outro comando para a saída (evitando que o segundo comando passasse por cada linha de saída, tendo dito que, dependendo da saída, poderia melhorar o desempenho para o script)

NOTA: as opções find são não posicionais (-maxdepth afeta os testes especificados antes, assim como os especificados depois dele).

    
por 07.04.2017 / 15:42