localiza todos os subdiretórios finais em uma árvore

1

dada a seguinte estrutura:

oz123@debian:~/ $ tree .
.
├── a
│   ├── a1
│   ├── a2
│   └── a3
├── a1
│   ├── a11
│   ├── a12
│   └── a31
├── b
│   └── b1
│       ├── b11
│       │   └── b21
│       │       └── b31
│       ├── b12
│       └── b3
└── c

16 directories, 0 files

Como encontro todos os nós finais?

Eu encontrei as seguintes soluções que parecem serem boas, mas eu tenho que provar que não há caso de teste que irá falhar.

A página de ajuda dos estados -links :

You can also search for files that have a certain number of links, with ‘-links’. Directories normally have at least two hard links; their . entry is the second one. If they have subdirectories, each of those also has a hard link called .. to its parent directory. The . and .. directory entries are not normally searched unless they are mentioned on the find command line.

possível solução:

oz123@debian:~/ $ find .  -type d  -links 2
./a/a2
./a/a3
./a/a1
./c
./a1/a31
./a1/a11
./a1/a12
./b/b1/b12
./b/b1/b3
./b/b1/b11/b21/b31
  • Alguém pode fornecer uma solução melhor (sem usar pipes e sed, isso tem desempenho ...)
  • Funcionará em qualquer sistema de arquivos?
por Oz123 12.08.2013 / 10:21

2 respostas

1

link

find . -type d -exec sh -c '(ls -p "{}"|grep />/dev/null)||echo "{}"' \;

Mais lento que

find .  -type d  -links 2

de qualquer maneira.

    
por 12.08.2013 / 10:36
0

Experimente o seguinte one-liner:

find . -type d -execdir sh -c 'test -z "$(find "{}" -mindepth 1 -type d)" && echo $PWD/{}' ';'
    
por 23.09.2015 / 16:24