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 find
mando. 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 folder2
y folder3
solo 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 d
en 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 , -empty
y , 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 find
está vacía, por lo que la prueba ( [ -z … ]
) devuelve el estado de salida 0
, sh
devuelve 0
, -exec
es verdadero.