find . -type d
se puede usar para encontrar todos los directorios debajo de algún punto de inicio. Pero también devuelve el directorio actual ( .), que puede no ser deseado. ¿Cómo se puede excluir?
find . ! -path . -type d
Para este caso particular ( .), los campos de golf son mejores que la mindepthsolución (24 frente a 26 caracteres), aunque esto es probablemente un poco más difícil de escribir debido a !.
Para excluir otros directorios, esto jugará menos bien y requiere una variable para DRYness:
D="long_name"
find "$D" ! -path "$D" -type d
Mi árbol de decisión entre !y -mindepth:
!para la portabilidad..? Lanza una moneda.long_name? Uso -mindepth.
find /path/ ! -path "/path/first" ! -path "/path/second"es esta la única forma?find / ! -regex '/\(a\|b\)/.*'o más simplemente, canalizar a través de grep. Para no repetirse, lo anterior sería muy ineficiente y debería usar-prune: stackoverflow.com/questions/1489277/…findcongreppara excluir el directorio, pero el directorio principal todavía estaba allí, lo que hizo que todo se eliminara de todos modos.find, necesitaría verificar los prefijos: stackoverflow.com/questions/17959317/… Pero un Bash for loop puede manejarlo :-)\!) para estar seguro. Todos los ejemplos en mi máquina seman findhan escapado, por lo que parece que es probablemente una buena idea ™. Editar - Acabo de notar que incluso dice explícitamente:! expr True if expr is false. This character will also usually need protection from interpretation by the shell.No solo la profundidad de recursión
findpuede ser controlada por el-maxdepthparámetro, la profundidad también puede ser limitada desde "arriba" usando el-mindepthparámetro correspondiente . Entonces, lo que uno realmente necesita es:fuente
find . -mindepth 1 -maxdepth 1 -type d ...Lo uso
find ./* <...>cuando no me importa ignorar los archivos de puntos de primer nivel (el*glob no coincide con estos de forma predeterminada en bash; consulte la opción 'dotglob' en el shopt incorporado: https://www.gnu.org/software/bash /manual/html_node/The-Shopt-Builtin.html ).fuente
-execopción. Por ejemplo, si lo intentasfind dir/* -type d -exec rmdir {} \;, verás errores.rmdiry lo más probable es que le digan que los directorios no están vacíos, yafindque hará una búsqueda profunda en los directorios, mostrando a los padres antes que a sus hijos.Bueno, una solución simple también (la solución no estaba funcionando para mí en Windows Git Bash)
find * -type dPuede que no sea muy eficiente, pero hace el trabajo y es lo que necesitamos a veces.
[Editar]: Como comentó @AlexanderMills, no mostrará directorios ocultos en la ubicación raíz (por ejemplo
./.hidden), pero mostrará subdirectorios ocultos (por ejemplo./folder/.hiddenSub). [Probado con git bash en windows]fuente