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 mindepth
solució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/…find
congrep
para 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 find
han 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
find
puede ser controlada por el-maxdepth
parámetro, la profundidad también puede ser limitada desde "arriba" usando el-mindepth
pará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
-exec
opción. Por ejemplo, si lo intentasfind dir/* -type d -exec rmdir {} \;
, verás errores.rmdir
y lo más probable es que le digan que los directorios no están vacíos, yafind
que 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 d
Puede 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