find . -type d -links 2
funciona na maioria dos sistemas de arquivos, mas não em todos. Não acho que haja uma maneira de saber além de saber quais tipos de sistema de arquivos têm a propriedade de que os diretórios contêm um link para eles mesmos. O GNU find detecta isto dinamicamente (se ele imprime algo sobre "Ativar automaticamente a opção -noleaf do find", você sabe que seu sistema de arquivos não possui essa propriedade). Os tipos mais comuns de sistemas de arquivos são ok, mas não FAT ou btrfs.
Se você quiser ter certeza, terá que testar cada diretório. Uma maneira de fazer isso é invocar find
novamente para cada subdiretório.
find . -type d ! -exec sh -c '
find "$1/." ! -name . -type d -prune | grep -q "^"' sh {} \; -print
(com GNU find
, você pode substituir -prune
por -print -quit
para torná-lo um pouco mais eficiente).
Outra maneira é pós-processar a saída de find
. Com find -depth
, um diretório de folhas é aquele que não segue um subdiretório dele mesmo.
find . -depth -type d -print0 |
awk -v RS='find . -type d ! -exec sh -c '
find "$1/." ! -name . -type d -prune | grep -q "^"' sh {} \; -print
' '
substr(previous, 1, length($0) + 1) != $0 "/"
{ previous = $0 }
'