Estoy revisando una gran pila de código administrado por git, y cada vez que hago una grep, veo montones y montones de mensajes de la forma:
> grep pattern * -R -n
whatever/.git/svn: No such file or directory
¿Hay alguna forma de que esas líneas desaparezcan?
ag
,ack
o en sucgrep
lugar, son mucho más rápidos / mejores quegrep
para buscar repositorios de código.No such file or directory
mensajes para archivos y / o directorios que existen? O, por el contrario, ¿cómo segrep *
pueden obtener nombres de archivos que no existen? ¿Es esta una condición de carrera, donde algún otro proceso manipula el árbol de directorios (creación, cambio de nombre y eliminación de archivos) mientrasgrep
se ejecuta?Respuestas:
Puede usar el indicador
-s
o--no-messages
para suprimir errores.fuente
/bin/ls -1 | xargs grep 'some text'
le dará "no existe tal archivo o directorio" porque divide 'a b.txt' en 2 args. Si suprime, no notará que perdió un archivo.find
y usoprint0
conxargs -0
¿ Eso resuelve el problema? GraciasSi estás navegando por un repositorio de git, te recomiendo que lo uses
git grep
. No necesita pasar-R
ni el camino.Eso mostrará todas las coincidencias desde su directorio actual hacia abajo.
fuente
Ggrep
también busca desde la parte superior del directorio Git en lugar del directorio actual.Errores como ese generalmente se envían a la secuencia de "error estándar", que puede canalizar a un archivo o simplemente hacer desaparecer en la mayoría de los comandos:
fuente
He visto que sucede varias veces, con enlaces rotos (enlaces simbólicos que apuntan a archivos que no existen), grep intenta buscar en el archivo de destino, que no existe (de ahí el mensaje de error correcto y preciso).
Normalmente no me molesto mientras hago tareas de administrador de sistemas en la consola, pero desde dentro de los scripts busco archivos de texto con "buscar", y luego grep cada uno:
En vez de:
fuente
Por lo general, no dejo que grep haga la recursión en sí. Por lo general, hay algunos directorios que desea omitir (.git, .svn ...)
Puedes hacer alias inteligentes con posturas como esa:
A primera vista puede parecer excesivo, pero cuando necesita filtrar algunos patrones es bastante útil.
fuente
-exec
antes grep.\( -name .svn -o -name .git \)
¿Has probado la
-0
opción en xargs ? Algo como esto:fuente
find -print0 | xargs -0 grep 'text'
Uso
-I
en grep.Ejemplo:
grep SEARCH_ME -Irs ~/logs
.fuente
-I
omite archivos binarios, es equivalente a--binary-files=without-match
. Sin embargo, no suprime los mensajes "No existe tal archivo o directorio".Redirijo
stderr
astdout
y luego uso grep's invert-match (-v
) para excluir la cadena de advertencia / error que quiero ocultar:fuente