grep para archivos y abra las coincidencias resultantes

grep para archivos y abra las coincidencias resultantes

Estoy intentando abrir todos los archivos según algunos valores de retorno de grep en la línea de comando. Sé que puedo usar la -lopción para devolver solo nombres de archivos, pero me gustaría combinar esto de alguna manera con otra serie de indicadores o argumentos para obtener las rutas completas de dichos archivos.

He probado algo como:

find . -iname "*.ext" | xargs grep -l "mystring" | xargs open

Y también algo como:

grep -HR -l mystring . | xargs open

Con poco éxito. Tenga en cuenta que también me gustaría recurrir a todos los subdirectorios. Yo viesta pregunta, que no se relaciona completamente.

ACTUALIZAR:

Pude conseguir este tipo de trabajo con

grep -HR -l mystring . | xargs -L 1 open

El problema es que para muchos archivos, la línea de comando se queja de dos maneras:

LSOpenURLsWithRole() failed with error -1712 for the file /Users/blah/blah.ext

The files /blah/blah/file.ext do not exist, donde el camino tiene un espacio.

Respuesta1

Si tiene espacios en los nombres de los archivos, entonces debe usar print0la opción para el archivo, luego -0para xargsy, por último, -I {}para el segundo xargs.

find . -iname "*.maxpat" -print0 | xargs -0 grep -l "mystring" | xargs -I '{}' open '{}'

Probado con emacscomo opencomando.

Respuesta2

-exectoma el estado de salida del comando que ingresaste y lo usa lógicamente dentrofind

Entonces, algo simple como esto debería funcionar.

find . -iname "*.ext" -exec grep -q "mystring" {} \; -exec open {} \;

Respuesta3

No estoy seguro de qué versión grepestás usando, pero si leo la página de manual grepcorrectamente, el escaneo se detendrá después de la primera coincidencia exitosa. ¿Es eso lo que quieres? Lo que entendí por tu pregunta fue que querías "abrir todos los archivos".

Si no te importa usar vimo gvim, puedes usar esto:

$ grep -n mystring *.ext > /tmp/mystring.list
$ vim -q /tmp/mystring.list

(Nunca he intentado combinar estos dos comandos ya que vimno lee quickfix/ errorfilede stdin)

Vim abrirá el primer archivo /tmp/mystring.listy colocará el cursor directamente en la línea donde mystringse encontró. Puede ir a la siguiente instancia usando :cny a la instancia anterior usando :cp.

Si no es un vimusuario y, dado que dijo que la pregunta vinculada no le ayudó mucho, entonces find ... -print0debería ayudar, como ya se sugirió.

Respuesta4

Usar pwdpor encontrar:

find `pwd` -iname *.maxpat | xargs grep -l "mystring" | xargs open

información relacionada