Listar los archivos que contienen una palabra en particular en su texto


30

Me gustaría enumerar los archivos de forma recursiva y única que contienen la palabra dada.

Ejemplo : Comprobando la palabra 'check', lo normal es un grep

$ grep check * -R

Pero como hay muchas apariciones de esta palabra, obtengo mucha salida. Entonces solo necesito enumerar los nombres de archivo que contienen la palabra de búsqueda dada. Supongo que algún truco findy xargssería suficiente aquí, pero no estoy seguro.

¿Algunas ideas?

Respuestas:


39

Utilice la opción -lo --files-with-matchesque se documenta de la siguiente manera:

Suprimir salida normal; en su lugar, imprima el nombre de cada archivo de entrada desde el que normalmente se habría impreso la salida. El escaneo se detendrá en el primer partido. ( -lestá especificado por POSIX).

Entonces, para su ejemplo, puede usar lo siguiente:

$ grep check * -lR

Funciona también en MSYS. ¡Excelente!
Kos

2
Solía grep -rl "text to find" "/usr/share"y funcionó muy bien!
Shrout1

18
find . -type f -exec grep -l check {} +

Probablemente no desee utilizar la -Ropción que con las versiones modernas de GNU grepsigue enlaces simbólicos al descender directorios. En su lugar, utilice la -ropción que desde la versión 2.12 (abril de 2012) ya no sigue los enlaces simbólicos.

Si su grep no es el GNU, o es anterior a la versión 2.12, o si necesita que su código sea portátil a sistemas GNU que no sean de vanguardia, use el findcomando anterior.

De lo contrario, puedes hacer:

grep -rl check .

No lo use *(ya que eso omitiría los archivos ocultos en el directorio actual (y solo en el directorio actual) y causaría problemas para los archivos cuyo nombre comienza con a -), evite pasar opciones después de los argumentos, ya que no se garantiza que funcione dependiendo de Medio ambiente y no es portátil.


1

Prueba esto:

find . -type f | xargs grep -c check $1 | grep -v ":0"

En cuanto a las grepbanderas ...

-c devolverá un nombre de archivo seguido de: y un número que indica cuántas veces aparece la cadena de búsqueda en el archivo dado.

-vtomará la salida de la primera grepbúsqueda, filtrará los archivos con cero resultados e imprimirá solo los archivos con resultados distintos de cero.


Esto obtendrá un falso negativo si tiene archivos (o directores) cuyos nombres contienen :0. Es mejor que hacer grep -v ':0$'. Incluso eso se ahogará con los nombres de ruta que contienen líneas nuevas.
Scott

0

grep -rin "whatToFind" locationToFInd

por ejemplo, $ grep -rin "vihaan".

buscará y enumerará recursivamente los nombres de archivo y las líneas correspondientes que tienen "vihaan" en ellos, "." se refiere al directorio actual.


0
find . -type f | grep "keyword" *

buscar en el directorio actual. Para buscar desde la raíz, especifique en /lugar de.


0

grep -lR "text-to-find" <where-to-find> También funciona bien.

por ejemplo, grep -lR "NAVIGATE" .donde encontramos la palabra NAVIGATEen el .directorio actual.


-2
 grep -rli trim \` find . -name *.q \` 

Darle la lista de .qarchivos que contiene la palabra clavetrim

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.