linux - Excluir directorios.svn de grep
bash (11)
Creo que la opción --exclude de recursión es lo que estás buscando.
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo puedo excluir directorios de grep -R? 11 respuestas
Cuando grep mi directorio de copia de trabajo de Subversion, los resultados incluyen una gran cantidad de archivos de los directorios .svn. ¿Es posible grep recursivamente un directorio, pero excluir todos los resultados de los directorios .svn?
Dos greps harán el truco:
- El primer grep obtendrá todo.
El segundo grep utilizará la salida del primer grep como entrada (a través de la tubería). Al usar el indicador -v, grep seleccionará las líneas que NO coinciden con los términos de búsqueda. Voila. Te quedan todas las salidas del primer grep que no contienen .svn en la ruta del archivo.
-v, --invert-match Invertir el sentido de coincidencia, para seleccionar líneas que no coincidan.
grep the_text_you_want_to_search_for * | grep -v .svn
En mi GNU grep 2.5, --exclude-dirs
no es una opción válida. Como alternativa, esto funcionó bien para mí:
grep --exclude="*.svn-base"
Esta debería ser una solución mejor que excluir todas las líneas que contienen .svn/
ya que no filtraría accidentalmente tales líneas en un archivo real.
Otra opción, aunque no se perciba como una respuesta aceptable, es clonar el repositorio en git y usar git grep
.
En raras ocasiones, me encuentro con depósitos de svn que son tan masivos que no es práctico clonarlos a través de git-svn
. En estos casos excepcionales, utilizo una solución grep doble, svngrep , pero como indican muchas respuestas aquí, esto podría ser lento en repositorios grandes, y excluir las ocurrencias ''.svn'' que no son directorios. Yo diría que estos serían extremadamente raramente aunque ...
También con respecto al rendimiento lento de múltiples greps, una vez que has usado algo como git, casi todo parece lento en svn!
Una última cosa ... mi variación de svngrep pasa a través de la coloración, ¡cuidado, la implementación es fea! Aproximadamente grep -rn "$what" $where | egrep -v "$ignore" | grep --color "$what"
grep -rn "$what" $where | egrep -v "$ignore" | grep --color "$what"
Para grep versión 2.5.1 puede agregar múltiples elementos --exclude
para filtrar los archivos .svn
.
$ grep -V | grep grep
grep (GNU grep) 2.5.1
GREP_OPTIONS="--exclude=*.svn-base --exclude=entries --exclude=all-wcprops" grep -l -R whatever ./
Para grep> = 2.5.1a
Puede poner esto en su entorno (por ejemplo, .bashrc
)
export GREP_OPTIONS=''--exclude-dir=".svn"''
PD: gracias a Adrinan, hay citas extra en mi versión:
export GREP_OPTIONS=''--exclude-dir=.svn''
Probé grep''in doble en mi gran base de código y me llevó una eternidad así que obtuve esta solución con la ayuda de mi compañero de trabajo
La poda es mucho más rápida ya que deja de procesar esos directorios en comparación con ''grep -v'', que procesa todo y solo excluye la visualización de resultados
find . -name .svn -prune -o -type f -print0 | xargs -0 egrep ''YOUR STRING''
También puede alias este comando en su .bashrc como
alias sgrep=''find . -name .svn build -prune -o -type f -print0 | xargs -0 egrep ''
Ahora simplemente usa
sgrep ''whatever''
Si tienes GNU Grep, debería funcionar así:
grep --exclude-dir=".svn"
Si sucede que está en un sistema Unix sin GNU Grep, intente lo siguiente:
grep -R "whatever you like" *|grep -v "/.svn/*"
Si usa ack (un ''grep mejor'') lo manejará automáticamente (¡y también hará muchas otras cosas inteligentes!). Vale la pena echarle un vistazo.
psychoschlumpf es correcto, pero solo funciona si tienes la última versión de grep
. Las versiones anteriores no tienen la --exclude-dir
. Sin embargo, si tiene una base de código muy grande, la doble grepificación puede llevar una eternidad. Suelta esto en tu .bashrc
para un grep portable .svn
-less grep:
alias sgrep=''find . -path "*/.svn" -prune -o -print0 | xargs -0 grep''
Ahora puedes hacer esto:
sgrep some_var
... y obtener los resultados esperados.
Por supuesto, si eres una persona loca como yo que solo tiene que usar el mismo .bashrc
todas partes, podrías pasar 4 horas escribiendo una función de bash demasiado complicada para ponerla en su lugar. O bien , podría esperar que una persona loca como yo lo publique en línea:
grep --exclude-dir=".svn"
funciona porque el nombre ".svn" es bastante único. Pero esto podría fallar en un nombre más generalizado.
grep --exclude-dir="work"
no es a prueba de balas, si tiene "/ home / user / work" y "/ home / user / stuff / work" omitirá ambos. No es posible definir "/ * / work / *" para restringir la exclusión al solo nombre de la carpeta anterior. Por lo que pude experimentar, en grep GNU el simple --exclude no excluirá directorios.