¿Cómo puedo hacer que grep no imprima los errores 'No existe tal archivo o directorio'?

215

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?

Alex
fuente
1
En estos días recomendaría usar ag, acko en su cgreplugar, son mucho más rápidos / mejores que greppara buscar repositorios de código.
lunixbochs
Si está revisando el código y buscando evitar directorios particulares, tal vez debería mirar ack. Es un grep consciente del código fuente, y como tal ignorará activamente dichos directorios VCS (así como copias de seguridad vi y emacs, archivos no fuente, etc.).
Brian Agnew
2
¿Cómo puede un usuario obtener No such file or directorymensajes para archivos y / o directorios que existen? O, por el contrario, ¿cómo se grep *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) mientras grepse ejecuta?
Scott

Respuestas:

299

Puede usar el indicador -so --no-messagespara suprimir errores.

-s, --no-messages suprime mensajes de error

grep pattern * -s -R -n
Dogbert
fuente
14
@Alex @Dogbert Esto responde la pregunta, pero '-s' puede enmascarar problemas, por ejemplo, cuando usa xargs con grep. Intente crear 2 archivos en un directorio, 'aaa.txt' y 'a b.txt', ambos con la cadena 'algún texto'. El comando /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.
Kelvin
@ Kelvin lo hace, por ejemplo, si uso findy uso print0con xargs -0¿ Eso resuelve el problema? Gracias
Luka
1
@Luka Eso debería resolver el problema. No tendrá problemas si siempre usa esas opciones NUL, pero si no lo hace, está casi garantizado (en mi humilde opinión) que lo olvidará en el momento más inoportuno.
Kelvin
esto funciona en Mac OS X donde otras opciones (--quiet) no lo hacen
philshem
59

Si estás navegando por un repositorio de git, te recomiendo que lo uses git grep. No necesita pasar -Rni el camino.

git grep pattern

Eso mostrará todas las coincidencias desde su directorio actual hacia abajo.

Steve Prentice
fuente
55
+1 para el útil comando específico de git. Sin embargo, no funcionará para svn :-)
cadrian
2
+1 Este es el comando git que me he estado perdiendo, esto me permite buscar una cadena del estado del árbol en cualquier confirmación (agregando la confirmación después del "patrón").
Kelvin
1
Con el complemento fugitivo, Ggreptambién busca desde la parte superior del directorio Git en lugar del directorio actual.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Esto parece ser significativamente más rápido que el grep estándar. (¿Quizás ignora los archivos binarios, etc.? Ni idea, pero útil.)
Daniel
10

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:

grep pattern * -R -n 2>/dev/null
lunixbochs
fuente
Responde la pregunta, pero puede enmascarar problemas. Vea mi comentario bajo la respuesta de Dogbert.
Kelvin
5

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:

find /etc -type f -exec grep -nHi -e "widehat" {} \;

En vez de:

grep -nRHi -e "widehat" /etc
Isaac Uribe
fuente
4

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:

find . \( -name .svn -o -name .git \) -prune -o -type f -exec grep -Hn pattern {} \;

A primera vista puede parecer excesivo, pero cuando necesita filtrar algunos patrones es bastante útil.

cadrian
fuente
1
+1. Esto es mucho mejor que suprimir errores. Sin embargo, creo que se le olvidó la -execantes grep.
Kelvin
1
¿Qué significa esto? \( -name .svn -o -name .git \)
sbhatla
¿Por qué no usar los indicadores grep's --exclude o --exlcude-dir?
Choylton B. Higginbottom el
1
@sbhatla el paréntesis crea un orden de operaciones para el comando find. stackoverflow.com/questions/24338777/…
Choylton B. Higginbottom
4

¿Has probado la -0opción en xargs ? Algo como esto:

ls -r1 | xargs -0 grep 'some text'
coquedad
fuente
2
para encontrar debe agregar -print0find -print0 | xargs -0 grep 'text'
aliva
1

Uso -Ien grep.

Ejemplo: grep SEARCH_ME -Irs ~/logs.

Bala
fuente
1
-Iomite archivos binarios, es equivalente a --binary-files=without-match. Sin embargo, no suprime los mensajes "No existe tal archivo o directorio".
mwfearnley
0

Redirijo stderra stdouty luego uso grep's invert-match ( -v) para excluir la cadena de advertencia / error que quiero ocultar:

grep -r <pattern> * 2>&1 | grep -v "No such file or directory"
talleyho
fuente