Cómo excluir esta carpeta / current / dot de buscar "tipo d"

186
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?

Matthias Ronge
fuente

Respuestas:

194

Solución POSIX 7 :

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:

  • ¿guión? Uso !para la portabilidad.
  • sesión interactiva sobre GNU?
    • excluir .? Lanza una moneda.
    • excluir long_name? Uso -mindepth.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
Si necesita excluir múltiples rutas, ¿ find /path/ ! -path "/path/first" ! -path "/path/second"es esta la única forma?
Vincent De Smet
2
@VincentDeSmet ¿desea excluir solo esas rutas, o en realidad no recurrir a ellas? Si solo son los caminos, puede usar 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/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
mi problema era el siguiente: quería eliminar recursivamente todo dentro de un directorio, excepto 1 subdirectorio. Estaba usando findcon greppara excluir el directorio, pero el directorio principal todavía estaba allí, lo que hizo que todo se eliminara de todos modos.
Vincent De Smet
@VincentDeSmet No veo una solución directa find, necesitaría verificar los prefijos: stackoverflow.com/questions/17959317/… Pero un Bash for loop puede manejarlo :-)
Ciro Santilli 郝海东 冠状 病 六四 事件法轮功
Probablemente quieras escapar de la exclamación char ( \!) para estar seguro. Todos los ejemplos en mi máquina se man 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.
Adrian Günter
201

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:

find . -mindepth 1 -type d
Matthias Ronge
fuente
55
funciona en GNU find, pero desafortunadamente es una extensión gnu para POSIX 7 find , e incluso el LSB usa utilidades de shell POSIX (no las GNU extendidas)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
66
Esto funcionó para mí. A saber:find . -mindepth 1 -maxdepth 1 -type d ...
racl101
19

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
Milos Ivanovic
fuente
FYI. No uses este truco con la -execopción. Por ejemplo, si lo intentas find dir/* -type d -exec rmdir {} \;, verás errores.
plhn
Estás equivocado, o quizás desaconsejado. Ese comando funcionará bien. Si ve errores, vendrán de ellos rmdiry lo más probable es que le digan que los directorios no están vacíos, ya findque hará una búsqueda profunda en los directorios, mostrando a los padres antes que a sus hijos.
Milos Ivanovic
2
Nota: "ignorar los archivos de puntos de primer nivel" también significa excluir todos los archivos / directorios ocultos.
Jonathan H
2

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]

StackHola
fuente