Usar grep con el indicador --exclude-dir para excluir varios directorios

16

Estoy buscando en una aplicación Ruby on Rails una palabra usando grepOSX, y me gustaría excluir directorios que coincidan con un patrón determinado.

Estoy usando el siguiente comando:

grep -inRw -E 'direct' . --exclude-dir -E 'git|log|asset'

Este comando no está haciendo lo que pensé que haría. Así es como pensé que funcionaría:

  • i - búsqueda insensible a mayúsculas y minúsculas
  • n : imprime el número de línea en el que se encuentra el patrón
  • R - busca recursivamente
  • w - Solo quiero palabras completas, es decir, coinciden con "directo" pero no con "directorio"
  • -E - usa expresiones regulares extendidas
  • 'directo' : la expresión regular que quiero hacer coincidir
  • . - buscar en el directorio actual
  • --exclude-dir -E 'git | log | asset' - excluye directorios que coincidan con git o log o asset.

En términos de los directorios de exclusión, el comando todavía termina buscando en los directorios './git' y './log' , así como en './app/assets'

Obviamente me falta un conocimiento fundamental, pero no sé qué es.

Steven L.
fuente

Respuestas:

16

La descripción de la página del manual para esa opción es un tanto engañosa ... Es un patrón como en globos no patrón como en expresiones regulares . Por la infopágina :

--exclude-dir = GLOB

Omita cualquier directorio de línea de comandos con un sufijo de nombre que coincida con el patrón GLOB. Al buscar de forma recursiva, omita cualquier subdirectorio cuyo nombre base coincida con GLOB. Ignora las barras diagonales redundantes en GLOB.

Entonces, en su caso, podría ejecutar:

grep -inRw -E 'direct' . --exclude-dir={git,log,assets}

para excluir directorios nombrados git, logy / assetso eg

grep -inRw -E 'direct' . --exclude-dir={\*git,asset\*}

para excluir nombres de directorio que terminan gito comienzan con asset.

don_crissti
fuente
Muy interesante. Supongo que debería buscar qué es un globo.
Steven L.
Lo siento, pero ninguno de estos parece estar funcionando. ¿Sería útil si dijera que estoy usando esta versión de grep: grep (BSD grep) 2.5.1-FreeBSD?
Steven L.
Estoy perplejo porque estoy leyendo el manual de bsd grep ( freebsd.org/cgi/man.cgi?query=grep&sektion=&n=1 ) y no se menciona --exclude-dir. Abucheo.
Steven L.
2
OK, ahora veo el problema. Esta debe ser una versión modificada de grep utilizada solo por el sistema Apple. Estoy en Mac OS X. Lamento la confusión aquí. Estoy seguro de que hay un foro en otro lugar en stackexchange en el que puedo publicar.
Steven L.
@ user245185 ¿estás en BSD o en OSX? Ambos están en el tema aquí, pero edite su pregunta y díganos qué sistema operativo está utilizando. Los comportamientos de las herramientas estándar difieren entre las implementaciones a medida que descubres.
terdon
8

--exclude-dirno entiende |.

Sin embargo, puede obtener el mismo efecto especificando --exclude-dirvarias veces, una para cada directorio que desea excluir:

grep -inRw -E --exclude-dir 'asset' --exclude-dir 'git' --exclude-dir 'log' 'direct'
John1024
fuente
Funcionó para mi. Quería excluir el directorio de inicio, pero no funcionó con otras opciones como --exclude-dir={home}. Trabajé cuando --exclude-dir 'home'
escribí