
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 -l
opció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 print0
la opción para el archivo, luego -0
para xargs
y, por último, -I {}
para el segundo xargs
.
find . -iname "*.maxpat" -print0 | xargs -0 grep -l "mystring" | xargs -I '{}' open '{}'
Probado con emacs
como open
comando.
Respuesta2
-exec
toma 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 grep
estás usando, pero si leo la página de manual grep
correctamente, 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 vim
o 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 vim
no lee quickfix
/ errorfile
de stdin
)
Vim abrirá el primer archivo /tmp/mystring.list
y colocará el cursor directamente en la línea donde mystring
se encontró. Puede ir a la siguiente instancia usando :cn
y a la instancia anterior usando :cp
.
Si no es un vim
usuario y, dado que dijo que la pregunta vinculada no le ayudó mucho, entonces find ... -print0
debería ayudar, como ya se sugirió.
Respuesta4
Usar pwd
por encontrar:
find `pwd` -iname *.maxpat | xargs grep -l "mystring" | xargs open