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
findsirve para buscar archivos y directoriosgrepsirve 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
.txty dime cuáles contienen la palabraerror” - “Encuentra todos los
.confy mira si aparecepassword” - “Busca dentro de todos los scripts
.shcuáles usansudo” - “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" {} \;
findlocaliza los archivosgrepse ejecuta sobre cada archivo encontrado{}representa el archivo actual\;indica el final del comando que ejecutafind
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" {} \;
-Hmuestra el nombre del archivo-iignora 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" {} \;
-Hmuestra el archivo-nmuestra 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í?
findgenera una lista de archivosxargsse la pasa agrep
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"
-print0separa resultados con carácter nuloxargs -0los 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 -res más rápido de escribirfind + grepda 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
| Objetivo | Comando |
|---|---|
Buscar error en .log | find /var/log -type f -name "*.log" -exec grep -H "error" {} \; |
Buscar password en .conf | find /etc -type f -name "*.conf" -exec grep -H "password" {} \; |
Buscar sudo en scripts .sh | find /home/$USER -type f -name "*.sh" -exec grep -H "sudo" {} \; |
Buscar mysqli en .php | find /var/www/html -type f -name "*.php" -exec grep -H "mysqli" {} \; |
Buscar import en .py | find /home/$USER/proyecto -type f -name "*.py" -exec grep -H "import" {} \; |
Buscar error ignorando mayúsculas | find /var/log -type f -name "*.log" -exec grep -Hi "error" {} \; |
| Buscar coincidencia con número de línea | find /etc -type f -name "*.conf" -exec grep -Hn "Listen" {} \; |
Buscar palabra exacta linux en .txt | find /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" {} \;








