![Buscar todos los subdirectorios con 0 archivos](https://rvso.com/image/922412/Buscar%20todos%20los%20subdirectorios%20con%200%20archivos.png)
Quiero imprimir los nombres de todos los subdirectorios que no contienen archivos (pueden contener subdirectorios). Lo siguiente funciona para el directorio actual:
$ ls -p | grep -v / | wc -l | \
xargs -I % test % -eq 0 && pwd
Creo que podría haber una solución más elegante, ¿alguna sugerencia? ¿Y cómo tengo que cambiarlo para que recurra a todos los subdirectorios?
Tengo una estructura de prueba: prueba/prueba1/prueba4 y prueba/prueba2/prueba3/prueba5. El único archivo está en test/test1. Quiero ejecutar el comando en el directorio base (prueba/). Se supone que los resultados son: prueba/ ; prueba/prueba2/ ; test/test2/test3/ porque esos son los directorios que solo contienen subdirectorios pero no archivos. También se aceptarían los puntos finales vacíos test/test1/test4/ y test/test2/test3/test5.
Respuesta1
Usando fgrep para filtrar directorios con archivos:
$ find -type d | \
grep -xFv -f <(find -type f -printf %h\\n)
Respuesta2
Algo como esto:
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
Es bash -c ...
sólo un script "pequeño" que devuelve 0 o 1 después de buscar archivos en el directorio.
Respuesta3
Un enfoque diferente al 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
Recorra todas las carpetas, dentro de ellas recorra todos los elementos y busque archivos.
No es el script más corto, pero no fallará en nuevas líneas, espacios o similares en los nombres de sus archivos. Y también es fácil de leer cuando lo vuelves a mirar después de 5 años ;-)