Quiero encontrar todas las apariciones de foo
en un sistema de archivos grande mantenido por SVN pero no quiero hacer coincidir nada contenido en ningún .svn
directorio.
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 bloquea.
¿Qué estoy haciendo mal?
Respuesta1
--exclude-dir
no reemplaza la necesidad de enumerar archivos en la línea de comando. Está "colgado" porque grep
está esperando la entrada estándar.
grep -l -e 'foo' --exclude-dir=".svn"*
Considere usarack, que excluye .svn
carpetas similares (y tiene muchas otras características) de forma predeterminada.
Respuesta2
Te podría interesarack. Realiza búsquedas recursivas (y otras operaciones similares a grep) y excluye directorios como.svno.gitpor defecto.
Respuesta3
La grep --exclude-dir...
solución debería estar bien, pero sólo para mostrar otra forma, puedes hacer esto con find
's -prune
:
find -name .svn -prune -o -type f -exec grep -l "$pattern" {} +
Si desea ejecutar algo más, find
es mejor que un simple grep -r
:
find -name .svn -prune -o -type f -exec grep -q "$pattern" {} \; -exec ./process {} \;
Respuesta4
Si no desea acceder a directorios como.svn
alguna vezpuede configurar la $GREP_OPTIONS
variable para excluirla como se muestra a continuación:
export GREP_OPTIONS="--exclude-dir=\*/.svn/\*"
Simplemente agregue esta línea a su .bashrc
y sus greps recursivos ya no ingresarán a .svn
los directorios. Eso sí, puede quedar tan rico como quieras:
export GREP_OPTIONS="--exclude-dir=\*/.svn/\* --exclude-dir=\*/.hg/\* --exclude-dir=\*/.git/\* --exclude=\*~"