Encontre recursivamente cada primeiro arquivo em cada ramificação de uma árvore de diretórios

1

Considere a seguinte listagem de diretório:

/a/1
/a/2
/a/3
/b/1
/b/2
/b/3/a
/b/3/b
/c/a.whatever
/c/b
/c/c

Eu quero um comando que encontre o primeiro arquivo (classificação alfanumérica) em cada diretório (inc aninhado) e forneça a seguinte saída:

/a/1
/b/1
/b/3/a
/c/a.whatever

Isso parece um trabalho para find , mas estou com pouco café. Solte os Ninjas!

    
por Oli 11.10.2012 / 13:48

3 respostas

2

Outra solução - deve funcionar com espaços nos caminhos

find . -type d -exec sh -c 'find "{}" -maxdepth 1 -type f | sort | head -n 1' ";"

Em uma nota secundária, descobri que ls não possui as opções para exibir os caminhos completos e listar apenas arquivos (não dirs): (

    
por phoibos 11.10.2012 / 15:30
1

Usando os benefícios do awk , descobri o seguinte:

find -type d | awk '{print "find "$0" -type f | head -1"}' | sh | uniq

uniq se torna necessário porque localizar os subdiretórios ... provavelmente poderia contornar isso com um argumento de localização adicional de alguma forma.

editar
versão sem uniq

find -type d | awk '{print "find "$0" -maxdepth 1 -type f | head -1"}' | sh

Note que você pode ajustar facilmente o número de arquivos impressos por diretório. Para classificar os arquivos de antemão, use:

find -type d | awk '{print "find "$0" -maxdepth 1 -type f | sort | head -1"}' | sh
    
por cauon 11.10.2012 / 15:23
0

Bem, com um pouco de cutucão, minhas próprias habilidades de Ninja se recuperaram um pouco e vieram com este vaporizador:

find -type d | xargs -I{} bash -c "find {} -maxdepth 1 -type f | sort | head -1" | sort

Não é a mais elegante das consultas do sistema de arquivos, mas gera o que eu esperava.

    
por Oli 11.10.2012 / 15:13