¿Cómo buscar carpetas de forma recursiva en un sistema Linux que solo contiene carpetas?

¿Cómo buscar carpetas de forma recursiva en un sistema Linux que solo contiene carpetas?

Estoy tratando de encontrar un comando que busque de forma recursiva directorios que solo contengan uno o más directorios en el mismo nivel. Preferiblemente con el findmando. Como find . -type d.

Por ejemplo, en la siguiente estructura de archivos:

/tmp/folder1/folder1a/test.jpg
/tmp/folder1/file1a.tmp
/tmp/folder2/folder2a/test.jpg
/tmp/folder3/folder3a/
/tmp/folder3/folder3b/file.jpg

Me gustaría continuar folder2y folder3solo porque no contiene archivos en sí, solo contiene carpetas (con archivos).

Respuesta1

comm -23 <(find . -type d ! -empty | sort -u) <(find . -type f -printf '%h\n' | sort -u)

Esta es una lista de carpetas que no están vacías (al menos una cosa en ella), excluyendo aquellas que contienen archivos. Si también desea excluir elementos como canalizaciones y enlaces simbólicos, puede utilizar ! -type den lugar de -type f. No se puede hacer en una sola declaración de búsqueda porque la búsqueda no puede coincidir con criterios de contenido complejos (esto no es XPath).

Respuesta2

Si te entiendo bien, esto debería funcionar:

find . -type d ! -empty -exec sh -c '\
[ -z "`find "$1" -maxdepth 1 -mindepth 1 ! -type d -print -quit`" ]\
' sh {} \; -print

Debido a que , -emptyy , que no están en POSIX, es posible que la solución no funcione en su sistema operativo ( es solo para acelerar las cosas, puede omitir este fragmento; aunque es importante).-maxdepth-mindepth-quit-print -quit-maxdepth 1 -mindepth 1

El truco consiste en ejecutar un shell separado para cada directorio que no esté vacío, que verifique (de forma no recursiva) si el directorio no contiene ningún elemento que no sea un directorio. Esto se hace con -exec sh … \;, aquí actúa como prueba. Si el directorio no contiene nada que no sea un directorio, entonces la salida del interior findestá vacía, por lo que la prueba ( [ -z … ]) devuelve el estado de salida 0, shdevuelve 0, -execes verdadero.

información relacionada