Grep, ignora las advertencias

50

Estoy tratando de encontrar el directorio de instalación de un paquete en particular. Tengo una determinada palabra clave con la que estoy tratando de encontrar un archivo en particular.

Durante grep, solo quiero incluir el tipo de archivo cpp o h . No quiero que grep muestre advertencias como Permiso denegado o No se pudo encontrar el Directorio . Solo quiero que muestre archivos coincidentes, nada más. Por favor sugiera cómo puedo hacer esto?

Actualmente estoy usando

grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./
Neeraj Gupta
fuente

Respuestas:

56

Esas advertencias se dirigen a la stderrsecuencia, en oposición al descriptor de archivo de salida estándar. Puede silenciar la salida stderr agregando 2>/dev/nullal final de su comando.

James Henstridge
fuente
Más específico find . 2>/dev/null | grep 404.htmles cómo se vería un comando
csga5000 el
30

Más directamente que filtrar las advertencias, puede deshabilitarlas agregando -s:

grep "My term" -sir --exclude-dir="\.svn" --include=*.{cpp,h} ./

Hay algunos problemas de compatibilidad con esta opción. Sin embargo, esto no debería ser un problema para uso personal.

-s, --no-messages: suprime los mensajes de error sobre archivos inexistentes o ilegibles. Nota de portabilidad: a diferencia de GNU grep, la séptima edición de Unix grep no se ajustaba a POSIX, porque carecía de -q y su opción -s se comportaba como la opción -q de GNU grep. El grep de estilo USG también carecía de -q pero su opción -s se comportaba como GNU grep. Los scripts de shell portátiles deben evitar tanto -q como -s y, en su lugar, deben redirigir los resultados estándar y de error a / dev / null. (-s es especificado por POSIX.)

Sebastian vom Meer
fuente
Acabo de instalar 13.04 y recibo los errores que no obtenía con 12.04. ¿Podría ser que algo cambió? Pensé que era genial que grep dejara de advertir sobre archivos como directorios, ya que en la mayoría de los casos simplemente no me importa.
Alexis Wilke
Lo siento, todavía estoy en 12.10, así que no puedo confirmar esto.
Sebastian vom Meer
5

Solía ​​recibir un montón de mensajes molestos como este:

grep: commands: Is a directory
grep: events: Is a directory
grep: views: Is a directory

La razón es que la --directoriesbandera está predeterminada read. Lo cambié a recurse; si no desea que realice automáticamente una búsqueda recursiva, puede usarla skipen su lugar.

La forma más fácil de manejar esto todo el tiempo es establecerlo en una variable de entorno. En ~/.bash_profileo ~/.bashrcsegún su distribución:

export GREP_OPTIONS='--directories=recurse'

Ahora suprime automáticamente esos mensajes cada vez que uso grep.

Otra opción es la --no-messagesbandera, taquigrafía -s. Esto también eliminará los Is a directorymensajes, pero también suprime otros mensajes que podrían ser más útiles. Por ejemplo, si está haciendo una búsqueda anidada */*/*y no existe tal archivo de ese patrón, no se lo dirá.

andrewtweber
fuente
buena explicación
aldr
1

Un enfoque alternativo en lugar de hacerlo greprecursivamente -ir sería dejar que el findcomando (que es recursivo por defecto) maneje los permisos con -readablebandera y rutas para excluir con -not -path "*.svn*"banderas, y luego pasar el archivo a grep. La exclusión de directorios se realiza -type fpara encontrar solo archivos normales.

$ find . -not -path "*.svn*" -type f -name "*.cpp" -or -name "*.h"  -readable -exec grep "my terms" "{}" \; 
Sergiy Kolodyazhnyy
fuente
0

Al realizar búsquedas recursivas en archivos específicos, es mucho mejor usarlo ack-grep. La sintaxis aquí sería:

ack-grep -i "My term" --cpp --h

Para eliminar los mensajes de error de permiso, es posible que desee ejecutar el mismo comando con sudo:

ack-grep -i "My term" --cpp --h

Pero eventualmente, si desea buscar paquetes instalados, mire esas diversas opciones: https://www.google.com/search?q=ubuntu%20search%20inside%20installed%20packages

Dargaud
fuente