Como posso listar todos os arquivos, mas apenas em diretórios que não possuem subdiretórios?

3

Eu tenho uma árvore de diretórios que desejo pesquisar recursivamente para todos os arquivos de um determinado tipo (por exemplo, todos os .jpg 's), mas só quero listar esses arquivos se eles estiverem na parte inferior de uma árvore de diretórios .

Como exemplo, se minha árvore se parece com:

                          home
                          root
                   f1     f2     f3
                   f11    f22    f33
                   f111   f222   f333

e todas as pastas têm .jpg , só quero listar as .jpg em f111 / f222 / f333 e assim por diante e ignorar aquelas nas pastas mais altas .

Eu sei que posso usar um comando find (como find . -name "*.jpg" ) para obter uma listagem de todos os .jpg em toda a árvore, mas não tenho certeza de como limitá-la somente à maioria das pastas sem fazer algo como grep 'ing os resultados para filtrar 111 / 222 / 333 , o que não é realmente viável já que tenho centenas de pastas e não sei quais são as pastas de último nível pode ser nomeado para todos eles individualmente.

    
por LostInTrees 05.11.2015 / 17:28

2 respostas

2

Você pode fazer isso em duas etapas:

find . -type d -links 2 -print0 | xargs -0 -I{} find {} -name \*.jpg

O primeiro comando lista todos os diretórios sem nenhum subdiretório (já que cada subdiretório adiciona um ao contador de links, enquanto um diretório vazio tem dois). O segundo invoca find manualmente em cada um desses resultados.

    
por 05.11.2015 / 17:34
1

Um equivalente POSIX da @ solução do TomHunt .

find . -type d -links 2 -exec sh -c '
  find "$@" -type f -name "*.jpg"' sh {} +

O -links 2 confia na propriedade de alguns sistemas de arquivos de que a contagem de links de diretórios (inicialmente 2 para a entrada em seu pai e a entrada . em si) aumenta em um para cada subdir (por causa do .. entrada neles). Alguns sistemas de arquivos modernos, como btrfs ou nilfs , cujas estruturas são radicalmente diferentes, não possuem essa propriedade.

Com zsh , você pode fazer algo como:

has_subdirs() {
  local l
  l=($REPLY/*(/DNoN[1]))
  (($#l))
}
dirs_without_subdirs=(**/*(DN^+has_subdirs))
jpgs=($^dirs_without_subdirs/*.jpg(ND.))
(($#jpgs)) && printf '%s\n' $jpgs
    
por 05.11.2015 / 17:57