¿Cómo puedo encontrar todos los archivos que contienen un texto específico en Linux?

Estoy tratando de encontrar una manera de escanear todo mi sistema Linux para todos los archivos que contienen una cadena de texto específica. Sólo para aclarar, I'm buscando el 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 que muestra todos los archivos del sistema.

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

Solución

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 significa coincidir con toda la palabra.
  • -l (L minúscula) se puede añadir para dar sólo el nombre de los archivos que coinciden.

Junto con esto, las banderas --exclude, --include, --exclude-dir pueden ser utilizadas para una búsqueda eficiente:

  • Esto sólo buscará en aquellos archivos que tengan extensiones .c o .h:

    grep --include=\*.{c,h} -rnw '/ruta/al/algo/' -e "patrón"
  • Esto excluirá la búsqueda de todos los archivos que terminen con la extensión .o:

    grep --exclude=*.o -rnw '/ruta/a/algún lugar/' -e "patrón"
  • En el caso de los directorios, es posible excluir uno o varios directorios concretos mediante el parámetro --exclude-dir. Por ejemplo, esto excluirá los directorios dir1/, dir2/ y todos los que coincidan con *.dst/:

    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/ruta/hacia/algún lugar/' -e "patrón"

Esto me funciona muy bien, para conseguir casi el mismo propósito que el tuyo.

Para más opciones consulta man grep.

Comentarios (36)

Puede utilizar 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.
Comentarios (29)

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

Solo hazlo:

ack 'text-to-find-here'

En su directorio raíz.

También puede utilizar expresiones regulares, especificar el tipo de archivo, etc.


ACTUALIZACIÓN

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

Comentarios (3)