1.7 – Uso combinado de grep y find

Los comandos find y grep son muy potentes por separado, pero cuando se combinan permiten hacer búsquedas mucho más completas.

Recordatorio rápido

  • find sirve para buscar archivos y directorios
  • grep sirve para buscar texto dentro de archivos

Cuando los usamos juntos, podemos hacer cosas como:

  • localizar archivos de un tipo concreto y buscar texto dentro de ellos
  • encontrar configuraciones específicas en muchos archivos
  • revisar proyectos completos
  • analizar logs
  • buscar palabras sensibles dentro de archivos de configuración
  • localizar cadenas de texto en estructuras grandes de carpetas

¿Por qué combinarlos?

Porque muchas veces no basta con saber dónde está un archivo ni basta con saber qué texto contiene un archivo concreto.

Lo que realmente queremos es algo como esto:

  • “Busca todos los archivos .txt y dime cuáles contienen la palabra error
  • “Encuentra todos los .conf y mira si aparece password
  • “Busca dentro de todos los scripts .sh cuáles usan sudo
  • “Revisa todos los archivos PHP y encuentra dónde se usa mysqli

Ahí es donde find localiza los archivos y grep inspecciona su contenido.


Forma más común de combinarlos

La combinación más habitual se hace con -exec.

Sintaxis general

find [ruta] [condición de archivos] -exec grep [opciones] "patrón" {} \;
  • find localiza los archivos
  • grep se ejecuta sobre cada archivo encontrado
  • {} representa el archivo actual
  • \; indica el final del comando que ejecuta find

Primer ejemplo básico

Buscar la palabra error en todos los archivos .log

find /var/log -type f -name "*.log" -exec grep "error" {} \;

¿Qué hace este comando?

  • busca en /var/log
  • solo archivos normales (-type f)
  • cuyo nombre termine en .log
  • y en cada uno ejecuta grep "error"

Mostrar también el nombre del archivo

En muchos casos conviene usar grep -H para que aparezca el nombre del fichero junto al resultado.

find /var/log -type f -name "*.log" -exec grep -H "error" {} \;

Así no solo vemos la línea encontrada, sino también en qué archivo aparece.


Ejemplos prácticos de find + grep

1. Buscar la palabra password en archivos .conf

find /etc -type f -name "*.conf" -exec grep -H "password" {} \;

Uso típico

Revisar configuraciones donde se haya escrito la palabra password.


2. Buscar localhost en archivos .conf

find /etc -type f -name "*.conf" -exec grep -H "localhost" {} \;

Uso típico

Buscar configuraciones locales o referencias a servicios en la propia máquina.


3. Buscar la palabra sudo en scripts .sh

find /home/$USER -type f -name "*.sh" -exec grep -H "sudo" {} \;

Uso típico

Detectar scripts que usan privilegios elevados.


4. Buscar mysqli en archivos PHP

find /var/www/html -type f -name "*.php" -exec grep -H "mysqli" {} \;

Uso típico

Encontrar dónde se está usando esa librería o función en un proyecto web.


5. Buscar líneas con import en archivos Python

find /home/$USER/proyecto -type f -name "*.py" -exec grep -H "import" {} \;

Uso típico

Revisar módulos importados dentro de un proyecto Python.


6. Buscar la palabra TODO en archivos de código

find /home/$USER/proyecto -type f -name "*.js" -exec grep -H "TODO" {} \;

También podríamos ampliar a varios tipos de archivo por separado.

Por ejemplo para Java:

find /home/$USER/proyecto -type f -name "*.java" -exec grep -H "TODO" {} \;

Uso típico

Localizar tareas pendientes dejadas por el programador.


7. Buscar root dentro de archivos .txt

find /home/$USER -type f -name "*.txt" -exec grep -H "root" {} \;

Uso típico

Revisar documentación, apuntes o ficheros exportados.


8. Buscar líneas que contengan error ignorando mayúsculas

find /var/log -type f -name "*.log" -exec grep -Hi "error" {} \;
  • -H muestra el nombre del archivo
  • -i ignora mayúsculas y minúsculas

Esto encontraría error, Error, ERROR, etc.


9. Buscar coincidencias con número de línea

find /etc -type f -name "*.conf" -exec grep -Hn "Listen" {} \;
  • -H muestra el archivo
  • -n muestra el número de línea

Muy útil para editar luego el archivo correcto.


10. Buscar palabras exactas dentro de archivos localizados por find

find /home/$USER -type f -name "*.txt" -exec grep -Hw "linux" {} \;

La opción -w hace que grep busque la palabra exacta linux, no partes de otras palabras.

Usar find + grep con borrado o acciones posteriores

A veces queremos localizar archivos cuyo contenido cumpla una condición y luego actuar sobre ellos. Aquí hay que ir con mucho cuidado, porque el pingüino no perdona los comandos mal puestos.

Ejemplo: buscar scripts que contienen rm

find /home/$USER/scripts -type f -name "*.sh" -exec grep -H "rm" {} \;

Antes de ejecutar un script o revisarlo, puede interesar detectar si contiene órdenes de borrado.


Alternativa con xargs

También se puede combinar find con grep usando xargs.

Ejemplo

find /etc -type f -name "*.conf" | xargs grep -H "localhost"

¿Qué ocurre aquí?

  • find genera una lista de archivos
  • xargs se la pasa a grep

Ventaja

Puede resultar más rápido o más cómodo en algunos casos.

Inconveniente

Puede dar problemas si los nombres de archivos tienen espacios o caracteres raros.

Por eso, en documentación básica para alumnos, suele ser más seguro enseñar primero -exec.


Variante segura con espacios en nombres

Si más adelante quieres mostrar una versión más robusta:

find /etc -type f -name "*.conf" -print0 | xargs -0 grep -H "localhost"
  • -print0 separa resultados con carácter nulo
  • xargs -0 los interpreta correctamente

Esto evita errores con nombres de archivo que contienen espacios.


Diferencia entre usar solo grep -r y usar find + grep

Esto conviene explicarlo porque los alumnos pueden pensar:
“¿Para qué combinar nada si grep ya busca en carpetas?”

La respuesta es: depende del control que quieras tener.

Con grep -r

grep -r "localhost" /etc

Busca recursivamente en todos los archivos del directorio.

Con find + grep

find /etc -type f -name "*.conf" -exec grep -H "localhost" {} \;

Busca solo en archivos .conf.

Conclusión

  • grep -r es más rápido de escribir
  • find + grep da un control mucho más preciso sobre qué archivos analizar

Casos reales donde se usan juntos

1. Administración de sistemas

Buscar una directiva concreta en archivos de configuración:

find /etc -type f -name "*.conf" -exec grep -Hn "ServerName" {} \;

2. Desarrollo web

Buscar credenciales hardcodeadas o funciones concretas:

find /var/www/html -type f -name "*.php" -exec grep -Hn "password" {} \;

3. Python

Buscar imports concretos:

find /home/$USER/proyecto -type f -name "*.py" -exec grep -Hn "requests" {} \;

4. Shell scripting

Localizar scripts que usan curl:

find /home/$USER/scripts -type f -name "*.sh" -exec grep -Hn "curl" {} \;

5. Revisión de logs

Buscar palabras clave en logs concretos:

find /var/log -type f -name "*.log" -exec grep -Hi "failed" {} \;

Resumen: find + grep

ObjetivoComando
Buscar error en .logfind /var/log -type f -name "*.log" -exec grep -H "error" {} \;
Buscar password en .conffind /etc -type f -name "*.conf" -exec grep -H "password" {} \;
Buscar sudo en scripts .shfind /home/$USER -type f -name "*.sh" -exec grep -H "sudo" {} \;
Buscar mysqli en .phpfind /var/www/html -type f -name "*.php" -exec grep -H "mysqli" {} \;
Buscar import en .pyfind /home/$USER/proyecto -type f -name "*.py" -exec grep -H "import" {} \;
Buscar error ignorando mayúsculasfind /var/log -type f -name "*.log" -exec grep -Hi "error" {} \;
Buscar coincidencia con número de líneafind /etc -type f -name "*.conf" -exec grep -Hn "Listen" {} \;
Buscar palabra exacta linux en .txtfind /home/$USER -type f -name "*.txt" -exec grep -Hw "linux" {} \;

Recomendaciones

1. Empieza probando find solo

Antes de combinar, comprueba qué archivos se están seleccionando.

find /etc -type f -name "*.conf"

2. Después añade grep

Cuando veas que los archivos son los correctos, añades la búsqueda de texto.

3. Usa -H casi siempre

Así sabrás en qué archivo aparece cada coincidencia.

4. Usa -n cuando quieras editar luego

Te ahorra tiempo porque muestra la línea exacta.

5. No busques a ciegas en /

Buscar desde la raíz puede generar muchísimo ruido y errores de permisos.


Ejercicios propuestos: combinar find y grep

Ejercicio 1

Busca la palabra import dentro de todos los archivos .py de una carpeta llamada proyecto.

Ejercicio 2

Busca la palabra error dentro de todos los archivos .log de /var/log.

Ejercicio 3

Busca la palabra localhost dentro de todos los archivos .conf de /etc.

Ejercicio 4

Busca la palabra sudo dentro de todos los scripts .sh de tu carpeta personal.

Ejercicio 5

Busca la palabra linux como palabra exacta dentro de todos los archivos .txt de tu carpeta personal.


Soluciones de los ejercicios

Ejercicio 1

find /home/$USER/proyecto -type f -name "*.py" -exec grep -H "import" {} \;

Ejercicio 2

find /var/log -type f -name "*.log" -exec grep -H "error" {} \;

Ejercicio 3

find /etc -type f -name "*.conf" -exec grep -H "localhost" {} \;

Ejercicio 4

find /home/$USER -type f -name "*.sh" -exec grep -H "sudo" {} \;

Ejercicio 5

find /home/$USER -type f -name "*.txt" -exec grep -Hw "linux" {} \;