Pregunta ¿Cómo encuentro todos los archivos que contienen texto específico en Linux?


Estoy tratando de encontrar una forma de escanear todo mi sistema Linux para todos los archivos que contienen una cadena de texto específica. Solo para aclarar, estoy buscando texto dentro del archivo, no en el nombre del archivo.

Cuando estaba buscando cómo hacer esto, me encontré con esta solución dos veces:

find / -type f -exec grep -H 'text-to-find-here' {} \;

Sin embargo, no funciona. Parece mostrar todos los archivos en el sistema.

¿Está cerca de la forma correcta de hacerlo? Si no, ¿cómo debería? Esta capacidad de encontrar cadenas de texto en archivos sería extraordinariamente útil para algunos proyectos de programación que estoy haciendo.


3677
2018-06-06 08:06


origen


Respuestas:


Haz lo siguiente:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r o -R es recursivo,
  • -n es el número de línea, y
  • -w representa la palabra completa.
  • -l (minúscula L) puede agregarse para dar el nombre de archivo de los archivos coincidentes.

Junto con estos, --exclude, --include, --exclude-dir las banderas se pueden utilizar para una búsqueda eficiente:

  • Esto solo buscará aquellos archivos que tengan extensiones .c o .h:

    grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
    
  • Esto excluirá la búsqueda de todos los archivos que terminan con la extensión .o:

    grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
    
  • Para los directorios, es posible excluir un directorio (s) particular a través de --exclude-dir parámetro. Por ejemplo, esto excluirá los directorios dir1 /, dir2 / y todos ellos que coincidan con * .dst /:

    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
    

Esto funciona muy bien para mí, para lograr casi el mismo propósito que el tuyo.

Para ver más opciones man grep.


6648
2018-06-06 08:21



Puedes usar grep -ilR:

grep -Ril "text-to-find-here" /
  • i significa ignorar el caso (opcional en su caso).
  • R significa recursivo
  • l significa "mostrar el nombre del archivo, no el resultado en sí".
  • / significa comenzar en la raíz de su máquina.

1085
2018-06-06 08:08



Puedes usar ack. Es como grep para el código fuente. Puede escanear todo su sistema de archivos con él.

Solo haz:

ack 'text-to-find-here'

En tu directorio raíz.

También puedes usar expresiones regulares, especifique el tipo de archivo, etc.


ACTUALIZAR

Acabo de descubrir The Silver Searcher, que es como ack pero 3-5 veces más rápido que él e incluso ignora los patrones de .gitignore archivo.


232
2018-06-06 08:26



Puedes usar:

grep -r "string to be searched"  /path/to/dir

los r significa recursivo y, por lo tanto, buscará en la ruta especificada y también en sus subdirectorios. Esto le dirá el nombre del archivo e imprimirá la línea en el archivo donde aparece la cadena.

O un comando similar al que estás intentando (ejemplo:) para buscar en todos los archivos javascript (* .js):

find . -name '*.js' -exec grep -i 'string to search for' {} \; -print

Esto imprimirá las líneas en los archivos donde aparece el texto, pero no imprime el nombre del archivo.

Además de este comando, podemos escribir esto también: grep -rn "Cadena para buscar" / ruta / a / directorio / o / archivo -r: búsqueda recursiva n: el número de línea se mostrará para los partidos


125
2018-03-14 23:29



Puedes usar esto:

grep -inr "Text" folder/to/be/searched/

83
2017-07-31 13:44



Lista de nombres de archivos que contienen un texto dado

Antes que nada, creo que has usado -H en lugar de -l. También puedes intentar agregar el texto entre comillas seguido de {} \.

find / -type f -exec grep -l "text-to-find-here" {} \; 

Ejemplo

Digamos que está buscando archivos que contengan texto específico "Apache License" dentro de su directorio. Mostrará resultados algo similares a los de abajo (el resultado será diferente según el contenido de su directorio).

bash-4.1$ find . -type f -exec grep -l "Apache License" {} \; 
./net/java/jvnet-parent/5/jvnet-parent-5.pom
./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom
./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom
./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom
./commons-codec/commons-codec/1.9/commons-codec-1.9.pom
./commons-io/commons-io/2.4/commons-io-2.4.pom
bash-4.1$ 

Eliminar la sensibilidad del caso

Incluso si no usa el caso como "texto" en comparación con "TEXTO", puede usar -i cambiar para ignorar el caso. Puedes leer más detalles aquí.

Espero que esto te ayude.


48
2017-11-09 13:18



Si tu grep no es compatible con la búsqueda recursiva, puede combinar find con xargs:

find / -type f | xargs grep 'text-to-find-here'

Me parece más fácil de recordar que el formato para find -exec.

Esto generará el nombre de archivo y el contenido de la línea coincidente, p.

/home/rob/file:text-to-find-here

Indicadores opcionales que puede agregar a grep:

  • -i - Búsqueda no sensible a mayúsculas y minúsculas
  • -l - solo muestra el nombre del archivo donde se encontró la coincidencia
  • -h - solo muestra la línea que coincide (no el nombre del archivo)

46
2018-06-20 08:49