Com Bash 3:
find . -type d -exec sh -c \
'[[ $(find "$0" -mindepth 1 | wc -l) -eq 1 ]] && [[ $(find "$0" -mindepth 1 -type d | wc -l) -eq 0 ]] && echo "$0"' \
{} \;
Com o Bash 4:
shopt -s globstar
for dir in **/; do
[[ $(find "$dir" -mindepth 1 | wc -l) -eq 1 ]] && [[ $(find "$dir" -mindepth 1 -type d | wc -l) -eq 0 ]] && echo "$dir"
done
Em essência, faça uma iteração sobre cada diretório e, em seguida, verifique se esse diretório contém exatamente um filho (arquivo ou diretório) e verifique se esse filho não é um diretório. Se houver exatamente um filho e não for um diretório, echo
it.
Esteja avisado: isso falhará se diretórios ou arquivos contiverem uma nova linha em seu nome.
Pode ser mais fácil se você tiver utilitários GNU como find
com uma opção -printf
, mas o OS X não tem isso por padrão.