imprimiría el nombre del archivo delante de cada línea coincidente (agregamos /dev/nullpara el caso donde solo hay un archivo coincidente, ya grepque no imprime el nombre del archivo si se pasa solo un archivo para buscar. La implementación de GNU greptiene una -Hopción para eso como alternativa).
find .-name '*.py'-exec grep -l something {}+
imprimiría solo los nombres de los archivos que tienen al menos una línea coincidente.
Para imprimir el nombre del archivo antes de las líneas coincidentes, puede usar awk en su lugar:
O llame grepdos veces para cada archivo, aunque eso sería menos eficiente ya que ejecutaría al menos un grepcomando y hasta dos para cada archivo (y leería el contenido del archivo dos veces):
Dependiendo de la versión de GNU grep, greppuede o no mirar dentro de enlaces simbólicos o enlaces simbólicos transversales a directorios. También puede encontrar algunas variaciones en el manejo de otros tipos de archivos no regulares.
Stéphane Chazelas
5
Puede decirle a grep que incluya el nombre del archivo en la salida. Entonces, si hay una coincidencia, se mostrará en la consola; Si no hay coincidencia dentro de un archivo, no se imprimirá ninguna línea para ese archivo.
find . -name "*.py" | xargs grep -n -H something
De la man grep:
-H Always print filename headers with output lines
-n, --line-number
Each output line is preceded by its relative line number in the file, starting at line 1. The line number counter is reset for each file processed.
This option is ignored if -c, -L, -l, or -q is specified.
Si sus archivos pueden tener nombres con espacios en ellos, debe cambiar la tubería para usar caracteres NUL como separador. El comando completo ahora se verá así:
Hay grepalternativas que, de forma predeterminada, generan sus resultados en el formato que desee. Los 2 la mayoría de los populares, que yo sepa son ag(también conocido como "el buscador de plata") y ack. agse anuncia como una alternativa más rápida a ack.
No puedo mostrarte aquí, pero la salida está perfectamente coloreada. Obtengo los nombres de archivo en un verde oliva, los números de línea en amarillo dorado y la pieza coincidente en cada línea en rojo sangre. Sin embargo, los colores son personalizables.
Respuestas:
imprimiría el nombre del archivo después de las líneas coincidentes.
imprimiría el nombre del archivo delante de cada línea coincidente (agregamos
/dev/null
para el caso donde solo hay un archivo coincidente, yagrep
que no imprime el nombre del archivo si se pasa solo un archivo para buscar. La implementación de GNUgrep
tiene una-H
opción para eso como alternativa).imprimiría solo los nombres de los archivos que tienen al menos una línea coincidente.
Para imprimir el nombre del archivo antes de las líneas coincidentes, puede usar awk en su lugar:
O llame
grep
dos veces para cada archivo, aunque eso sería menos eficiente ya que ejecutaría al menos ungrep
comando y hasta dos para cada archivo (y leería el contenido del archivo dos veces):En cualquier caso, no desea recorrer la salida de
find
ese tipo y recordar citar sus variables .Si desea utilizar un bucle de shell, con herramientas GNU:
(también funciona en FreeBSD y derivados).
fuente
Si estás usando GNU grep, puede utilizar su
-r
o--recursive
la opción de hacer este sencillo hallazgo para usted:Solo necesita
find
si necesita predicados más avanzados.fuente
grep
,grep
puede o no mirar dentro de enlaces simbólicos o enlaces simbólicos transversales a directorios. También puede encontrar algunas variaciones en el manejo de otros tipos de archivos no regulares.Puede decirle a grep que incluya el nombre del archivo en la salida. Entonces, si hay una coincidencia, se mostrará en la consola; Si no hay coincidencia dentro de un archivo, no se imprimirá ninguna línea para ese archivo.
De la
man grep
:Si sus archivos pueden tener nombres con espacios en ellos, debe cambiar la tubería para usar caracteres NUL como separador. El comando completo ahora se verá así:
fuente
Puedes probar algo como:
Este comando exec grep para cada archivo, descubierto por el comando find y su función estándar de comando find
fuente
Usa el
-l
argumento.Un uso más difícil sería:
fuente
Hay
grep
alternativas que, de forma predeterminada, generan sus resultados en el formato que desee. Los 2 la mayoría de los populares, que yo sepa sonag
(también conocido como "el buscador de plata") yack
.ag
se anuncia como una alternativa más rápida aack
.No puedo mostrarte aquí, pero la salida está perfectamente coloreada. Obtengo los nombres de archivo en un verde oliva, los números de línea en amarillo dorado y la pieza coincidente en cada línea en rojo sangre. Sin embargo, los colores son personalizables.
fuente