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 lista sem ./
. Existe uma maneira de encontrar encontrar apenas os nomes brutos?
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'
foo bar ...
tudo em uma linha sem o./
na frente?Respostas:
Com o GNU,
find
você pode usar a-printf
opção:Conforme observado por Paweł nos comentários, se você não deseja que o diretório atual seja listado
-mindepth 1
, adicione , por exemplo:fonte
-printf
opção a mais recente POSIX especificação e me pergunto como portátil é ...printf
opções é mencionada pelo POSIX e elas não parecem ser suportadas por algumas das outrasfind
versões. A localização do GNU pode ser instalada na maioria dos lugares, portanto, nesse sentido, é portátil.-mindepth 1
se você quiser se livrar do.
Atualizar:
Uma alternativa mais curta:
Fornecerá os nomes, um por linha, sem barras
fonte
ls
. Ao mesmo tempo, eu publiquei um link sobre por que essa é uma má idéia em outra resposta que foi excluída desde então. Na época, havia apenas 2 respostas e o motivo parecia óbvio. Estou feliz que você apontou a ambiguidade, e aqui está a minha explicação. Para que conste, entreguei meu voto negativo em um voto positivo porque concordo com a sua resposta atual.\n
nome em um diretório que você não pode usar cut para recuperá-lo (que é o que você estava fazendo quando eu te diminuí o voto). Existem poucos casos emls
que não se comporta perigosamente e é quase sempre mais seguro usar outra maneira.Usando o GNU find, você pode usar -mindepth para impedir que o find corresponda ao diretório atual:
Como você não está fazendo isso recursivamente, você pode usar um bash glob:
Adicionar um final / a uma glob fará com que apenas os diretórios sejam correspondidos.
fonte
*/
perde arquivos de ponto e inclui links simbólicos. Isso pode ou não ser um problema.Vamos
sed
remover esses dois caracteres:fonte
Eu prefiro usar:
fonte
Eu costumo usar:
Mas não sei se é o caminho certo para fazer o que você deseja.
fonte
echo */
faria a mesma coisa, mais ou menos (ele perde arquivos de pontos e inclui links simbólicos), mas o joachim perguntaria como remover a final/
.No AIX, o parâmetro 'maxdepth' não funciona.
Em geral, isso funciona para mim:
find ./ -type d | cut -d"/" -f2 | sort -u
fonte
O que você está procurando é chamado
basename
, ele ignora a estrutura de diretórios unixExemplo abaixo:
find /any/path/you/want -maxdepth 1 -type d -exec basename {} \;
ele excluirá para a saída até o caminho dir, removendo a necessidade de
cd
antes de executar o comandoAlgumas informações adicionais:
Eu passaria
-exec
como argumento para encontrar|
(canal) outro comando para a saída (evitando o segundo comando passar por cada linha de saída, tendo dito que, dependendo da saída, isso poderia melhorar o desempenho do script)NOTA: as
find
opções não são posicionais (-maxdepth afeta os testes especificados antes e os especificados depois).fonte