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 . -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?
Respuestas:
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 / ! -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
con grep
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 se man 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:
find . -mindepth 1 -type d
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 ).
eclipse tmp # find. . ./pantalla ./screen/.testfile2 ./.X11-unix ./.ICE-unix ./tmux-0 ./tmux-0/default
eclipse tmp # find ./* ./pantalla ./screen/.testfile2 ./tmux-0 ./tmux-0/default
-exec
opción. Por ejemplo, si lo intentas find 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, ya find
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]
find /path/ ! -path "/path/first" ! -path "/path/second"
es esta la única forma?