![Pesquise todos os subdiretórios com 0 arquivos](https://rvso.com/image/922412/Pesquise%20todos%20os%20subdiret%C3%B3rios%20com%200%20arquivos.png)
Quero imprimir os nomes de todos os subdiretórios que contêm zero arquivos (eles podem conter subdiretórios). O seguinte funciona para o diretório atual:
$ ls -p | grep -v / | wc -l | \
xargs -I % test % -eq 0 && pwd
Acho que pode haver uma solução mais elegante, alguma sugestão? E como preciso alterá-lo para recorrer a todos os subdiretórios?
Eu tenho uma estrutura de teste: test/test1/test4 e test/test2/test3/test5. O único arquivo está em test/test1. Quero executar o comando no diretório base (test/). Os resultados devem ser: test/ ; teste/teste2/ ; test/test2/test3/ porque esses são os diretórios que contêm apenas subdiretórios, mas nenhum arquivo. Outros aceitáveis seriam os endpoints vazios test/test1/test4/ e test/test2/test3/test5.
Responder1
Usando fgrep para filtrar diretórios com arquivos:
$ find -type d | \
grep -xFv -f <(find -type f -printf %h\\n)
Responder2
Algo assim:
find . -type d -exec bash -c 'files=$(find $1 -mindepth 1 -maxdepth 1 -type f | wc -l) ; [[ $files -ne 0 ]] && exit 1 ; exit 0' script {} \; -print
É bash -c ...
apenas um script "pequeno" que retorna 0 ou 1 após verificar os arquivos no diretório.
Responder3
Uma abordagem diferente para o problema:
# Enable advanced glob
shopt -s globstar
# Enable matching hidden files (.*)
shopt -s dotglob
for d in **/; do
nofiles=true
for f in "$d"/*; do
[ -f "$f" ] && nofiles=false && break
done
[ $nofiles = true ] && echo "$d"
done
shopt -u globstar
shopt -u dotglob
Percorra todas as pastas, dentro delas faça um loop de todos os itens e verifique se há arquivos.
Não é o script mais curto, mas não falhará em novas linhas, espaços ou similares em nomes de arquivos. E é fácil de ler também quando você olha novamente depois de 5 anos ;-)