Buscar de forma recursiva la carpeta pero excluir la subcarpeta svn

10

Quiero encontrar todas las ocurrencias de fooun gran sistema de archivos mantenido por SVN, pero no quiero hacer coincidir nada contenido en ningún .svndirectorio.

Obtengo coincidencias inmediatas cuando lo hago, grep -l -e 'foo' *pero cuando intento excluir los directorios svn con grep -l -e 'foo' --exclude-dir=".svn"el comando simplemente se cuelga.

¿Qué estoy haciendo mal?

Anthony Elliott
fuente

Respuestas:

11

--exclude-dirno suplanta la necesidad de enumerar archivos en la línea de comando. Estás "colgando" porque grepestá esperando la entrada estándar.

grep -l -e 'foo' --exclude-dir = ". svn" *

Considere usar ack , que excluye .svny carpetas similares (y tiene muchas otras características) de forma predeterminada.

efímero
fuente
2
Más limpio si cambia *a ., en caso de que haya otras carpetas ocultas que deberían buscarse.
Kevin
o tal vez quieras usarlo --recursive ., ya que el OP ya tiene GNU grep.
jw013
Personalmente, tengo shopt -s dotgloben Bash, por lo que *ya contiene archivos de puntos. -res agradable, pero ackhace que, por defecto también :)
ephemient
5

Quizás te interese un ack . Realiza búsquedas recursivas (y otras operaciones similares a grep) y excluye directorios como .svn o .git de forma predeterminada.

WhyNotHugo
fuente
Como seguimiento de esto, actualmente uso ag, que es similar, pero más rápido.
WhyNotHugo
2

La grep --exclude-dir...solución debe estar bien, pero sólo para mostrar otra forma, se puede hacer esto con find's -prune:

find -name .svn -prune -o -type f -exec grep -l "$pattern" {} +

Si desea ejecutar algo más, findes mejor que un simple grep -r:

find -name .svn -prune -o -type f -exec grep -q "$pattern" {} \; -exec ./process {} \;
Kevin
fuente
1

Si no desea grep en directorios como .svn nunca , puede configurar la $GREP_OPTIONSvariable para excluirlo de la siguiente manera:

export GREP_OPTIONS="--exclude-dir=\*/.svn/\*"

Simplemente agregue esta línea a su .bashrcy sus greps recursivos ya no entrarán en los .svndirectorios. Por supuesto, puede ser tan rico como quieras:

export GREP_OPTIONS="--exclude-dir=\*/.svn/\* --exclude-dir=\*/.hg/\* --exclude-dir=\*/.git/\* --exclude=\*~"
brandizzi
fuente
1
Personalmente hago esto usando un alias para poder omitir la lista de exclusión si realmente necesito buscar dentro de esas carpetas, solo puedo usar grep sin tener que desarmar / anular la variable. También me permite mantener una lista de carpetas que puedo expandir fácilmente y agregar automáticamente a mi lista de exclusiones sin tener que escribir más.
dragon788
Ese es un buen enfoque. También tiene la ventaja de que, si necesita grep en las carpetas, no olvidará que establece una variable. (No es que alguna vez haya necesitado agarrarlos). Pero TBH en estos días uso ag (un clon ack) para estas cosas ^^
brandizzi
0

Aquí hay una solución awk también:

find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}'

Básicamente, de todos los archivos, elimine los que coinciden con /.svn/ y luego, fuera de ellos, imprima solo los que coincidan con / foo /. También me gusta esta solución, ya que puedes usar fácilmente los resultados con ls. Por ejemplo, puedes usar

ls -tl $(find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}')

para ver una vista de lista ordenada por fecha de modificación. Además, es bueno tener la ruta completa de los resultados si desea hacer algo más con ellos (abrirlos, ejecutarlos, etc.)

irrelefante
fuente