Quiero encontrar todas las ocurrencias de foo
un gran sistema de archivos 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 cuelga.
¿Qué estoy haciendo mal?
*
a.
, en caso de que haya otras carpetas ocultas que deberían buscarse.--recursive .
, ya que el OP ya tiene GNUgrep
.shopt -s dotglob
en Bash, por lo que*
ya contiene archivos de puntos.-r
es agradable, peroack
hace que, por defecto también :)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.
fuente
ag
, que es similar, pero más rápido.La
grep --exclude-dir...
solución debe estar bien, pero sólo para mostrar otra forma, se puede hacer esto confind
's-prune
:Si desea ejecutar algo más,
find
es mejor que un simplegrep -r
:fuente
Si no desea grep en directorios como
.svn
nunca , puede configurar la$GREP_OPTIONS
variable para excluirlo de la siguiente manera:Simplemente agregue esta línea a su
.bashrc
y sus greps recursivos ya no entrarán en los.svn
directorios. Por supuesto, puede ser tan rico como quieras:fuente
Aquí hay una solución awk también:
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
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.)
fuente