Búsqueda de Archivos y Contenido
Búsqueda de Archivos y Contenido
Introducción
Encontrar archivos y contenido específico es una tarea diaria para cualquier administrador de Linux. Los comandos find y grep son herramientas poderosas que te permitirán localizar exactamente lo que necesitas en un sistema con millones de archivos.
🗺️ En este tema aprenderás:
- Comando
find- búsqueda por nombre, tipo, tamaño, fecha - Comando
grep- búsqueda en contenido de archivos - Comando
locate- búsqueda rápida por base de datos - Combinación de comandos con pipes
- Uso de expresiones regulares
- Búsquedas avanzadas y filtros
El Comando find - Búsqueda por Atributos de Archivo
El comando find es extremadamente poderoso para localizar archivos basándose en nombre, tipo, tamaño, permisos, fecha de modificación y más.
Sintaxis básica:
BASH
find [ruta] [condiciones] [acciones]Condiciones principales:
-name patrón: Buscar por nombre-type f|d|l: Buscar por tipo (archivo, directorio, enlace)-size +/- n: Buscar por tamaño-mtime n: Modificado hace n días-perm modo: Buscar por permisos-user usuario: Archivos de un usuario
💡 Ejemplos Prácticos Multi-SO
Linux
BASH
$ find ~ -name "*.txt"
/home/usuario/archivo1.txt
/home/usuario/Documentos/notas.txt
/home/usuario/Proyectos/proyecto.txt- 1
-
-namebusca por nombre de archivo (case-sensitive)
macOS
BASH
$ find ~ -name "*.txt"
/Users/usuario/archivo1.txt
/Users/usuario/Documents/notes.txt
/Users/usuario/Projects/project.txt- 1
- Funciona igual que Linux
Windows
POWERSHELL
# find no existe en Windows nativo
# Usar Get-ChildItem recursivamente:
PS> Get-ChildItem -Path C:\Users\usuario -Filter "*.txt" -Recurse
Directory: C:\Users\usuario\Documents
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 29/1/2024 10:30 1024 archivo1.txt
-a--- 28/1/2024 15:45 2048 notas.txt
# O si tienes WSL:
PS> wsl find ~ -name "*.txt"- 1
-
PowerShell usa
Get-ChildItemcon-Filtery-Recurse
Ejemplo 2: Buscar archivos grandes (mayor a 100MB)
BASH
1$ find / -type f -size +100M
/var/lib/docker/overlay2/abc123.../layer.tar
/home/usuario/videos/pelicula.mp4
/var/cache/cache-file.bin- 1
-
-size +100Mbusca archivos mayores a 100MB - 2
-
+significa “mayor que”,-significa “menor que”
BASH
$ find ~ -type f -size +100M
/Users/usuario/Videos/pelicula.mp4
/Users/usuario/Library/Caches/cache-file.bin- 1
- Mismo funcionamiento que Linux
POWERSHELL
# Buscar archivos > 100MB
PS> Get-ChildItem -Path C:\Users -Recurse -File |
Where-Object {$_.Length -gt 100MB}
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 29/1/2024 10:30 104857600 pelicula.mp4- 1
-
PowerShell usa
-FileyWhere-Objectcon tamaño en bytes
Ejemplo 3: Buscar archivos modificados en últimos 7 días
BASH
1$ find ~ -type f -mtime -7
/home/usuario/Documentos/archivo-reciente.txt
/home/usuario/Descargas/descarga.pdf- 1
-
-mtime -7= modificado en últimos 7 días (negativo = pasado reciente) - 2
-
-mtime +7= modificado hace más de 7 días
BASH
$ find ~ -type f -mtime -7
/Users/usuario/Documents/archivo-reciente.txt- 1
- Mismo formato que Linux
POWERSHELL
# Archivos modificados en últimos 7 días
$fecha = (Get-Date).AddDays(-7)
PS> Get-ChildItem -Path C:\Users\usuario -Recurse -File |
Where-Object {$_.LastWriteTime -gt $fecha}- 1
- PowerShell requiere calcular la fecha manualmente
Ejemplo 4: Buscar directorios vacíos
BASH
1$ find ~ -type d -empty
/home/usuario/directorio-vacio
/home/usuario/proyectos/carpeta-vieja- 1
-
-type dbusca solo directorios - 2
-
-emptybusca elementos sin contenido
BASH
$ find ~ -type d -empty
/Users/usuario/empty-folder- 1
- Funciona igual
POWERSHELL
# Directorios vacíos
PS> Get-ChildItem -Path C:\Users\usuario -Recurse -Directory |
Where-Object {(Get-ChildItem $_.FullName -Recurse).Count -eq 0}- 1
- Se requieren verificaciones adicionales en PowerShell
Cuándo usar: find es tu herramienta para búsquedas estructuradas por metadatos de archivo.
El Comando grep - Búsqueda en Contenido
El comando grep busca patrones de texto dentro de archivos. Es extremadamente poderoso cuando lo combinas con expresiones regulares.
Sintaxis básica:
BASH
grep [opciones] patrón [archivo(s)]Opciones principales:
-i: Ignorar mayúsculas/minúsculas-r: Buscar recursivamente en directorios-n: Mostrar número de línea-c: Contar coincidencias-v: Invertir (mostrar líneas que NO coinciden)-E: Usar expresiones regulares extendidas
💡 Ejemplos Prácticos Multi-SO
Linux
BASH
$ grep "error" /var/log/syslog
[10:45:32] error: connection timeout
[10:46:00] error: authentication failed- 1
- Busca la palabra “error” en el archivo de log
macOS
BASH
$ grep "error" ~/Library/Logs/system.log
[10:45:32] error: connection timeout- 1
- Mismo funcionamiento
Windows
POWERSHELL
# grep no existe, usar Select-String:
1PS> Select-String -Path C:\path\to\file.log -Pattern "error"
archivo.log:5:error: connection timeout
archivo.log:8:error: authentication failed- 1
-
-Patternes el equivalente a patrón en grep - 2
- Devuelve línea y número automáticamente
Ejemplo 2: Búsqueda recursiva en directorios (grep -r)
BASH
$ grep -r "password" ~/proyectos/
proyectos/config.txt:mysql_password=secret123
proyectos/app/settings.py:password_hash = "abc123"- 1
-
-rbusca en todos los archivos del directorio recursivamente
BASH
$ grep -r "password" ~/Projects/
Projects/config.txt:mysql_password=secret123- 1
- Funciona igual
POWERSHELL
# Búsqueda recursiva
PS> Select-String -Path C:\proyectos -Pattern "password" -Recurse
config.txt:1:mysql_password=secret123
settings.py:15:password_hash = "abc123"- 1
-
-Recursees el equivalente a-rde grep
Ejemplo 3: Búsqueda con número de línea y case-insensitive
BASH
$ grep -in "ERROR" /var/log/syslog
45:[10:45:32] Error: connection timeout
67:[10:46:00] ERROR: authentication failed
1- 1
-
-iignora mayúsculas - 2
-
-nmuestra número de línea
BASH
$ grep -in "ERROR" ~/Library/Logs/system.log
45:[10:45:32] Error: connection timeout- 1
- Funciona igual
POWERSHELL
PS> Select-String -Path archivo.log -Pattern "ERROR" `
-CaseSensitive:$false |
Select-Object -Property LineNumber, Line
LineNumber Line
---------- ----
45 [10:45:32] Error: connection timeout
67 [10:46:00] ERROR: authentication failed- 1
-
Sin
-CaseSensitivees case-insensitive por defecto
Ejemplo 4: Contar coincidencias (grep -c)
BASH
$ grep -c "Failed password" /var/log/auth.log
42- 1
-
-csolo muestra el número de coincidencias
BASH
$ grep -c "Failed password" /var/log/auth.log
42- 1
- Funciona igual
POWERSHELL
PS> (Select-String -Path auth.log -Pattern "Failed password").Count
42- 1
- PowerShell cuenta las coincidencias automáticamente
Ejemplo 5: Expresiones regulares (grep -E)
BASH
- 1
-
-Ehabilita expresiones regulares extendidas - 2
-
^significa “comienza la línea” - 3
-
|significa “o”
BASH
$ grep -E "^(Error|Warning)" ~/Library/Logs/app.log
Error: Database connection failed- 1
- Funciona igual
POWERSHELL
# PowerShell usa .NET regex:
PS> Select-String -Path app.log -Pattern "^(Error|Warning)"
app.log:1:Error: Database connection failed
app.log:3:Warning: Memory usage high
app.log:5:Error: API timeout- 1
- PowerShell usa regex compatibles con .NET por defecto
Cuándo usar: grep es tu herramienta para búsquedas en el contenido de archivos.
Combinando find y grep con Pipes
La verdadera potencia viene al combinar herramientas. Los pipes (|) permiten pasar salida de un comando a otro.
💡 Ejemplos Prácticos Multi-SO
Linux
BASH
# Encontrar todos los .txt y buscar "importante" en ellos
$ find ~ -name "*.txt" -exec grep -l "importante" {} \;
/home/usuario/Documentos/notas.txt
/home/usuario/tareas.txt
# Alternativa con pipe (más moderna):
$ find ~ -name "*.txt" | xargs grep "importante"
Documentos/notas.txt:Este es un punto importante
tareas.txt:importante: completar antes del viernes
1- 1
-
-execejecuta un comando en cada resultado - 2
-
xargspasa los resultados como argumentos
macOS
BASH
$ find ~ -name "*.txt" -exec grep -l "importante" {} \;
/Users/usuario/Documents/notes.txt
$ find ~ -name "*.txt" | xargs grep "importante"
Documents/notes.txt:Este es un punto importante- 1
- Funciona igual que Linux
Windows
POWERSHELL
# Buscar archivos .txt con contenido "importante"
PS> Get-ChildItem -Path C:\Users\usuario -Filter "*.txt" -Recurse |
ForEach-Object { Select-String -Path $_.FullName -Pattern "importante" }
Documents\notes.txt:3:Este es un punto importante- 1
-
PowerShell usa tuberías (pipes) con
|igual que bash
Ejemplo 2: Encontrar archivos grandes con patrones específicos
BASH
# Buscar archivos .log > 1MB que contengan "error"
$ find /var/log -name "*.log" -size +1M -exec grep -l "error" {} \;
/var/log/syslog
/var/log/kern.log- 1
-
Combina múltiples condiciones de
find
BASH
$ find ~/Library/Logs -name "*.log" -size +1M | xargs grep -l "error"
~/Library/Logs/system.log- 1
- Funciona similar
POWERSHELL
PS> Get-ChildItem -Path C:\Logs -Filter "*.log" -Recurse |
Where-Object {$_.Length -gt 1MB} |
ForEach-Object { Select-String -Path $_.FullName -Pattern "error" } |
Select-Object -Unique Path- 1
- PowerShell requiere más pasos pero es más legible
El Comando locate - Búsqueda Rápida
El comando locate es mucho más rápido que find porque usa una base de datos pre-indexada. Sin embargo, solo busca nombres de archivo, no contenido.
Sintaxis:
BASH
locate [opciones] patrón💡 Ejemplos Prácticos Multi-SO
Linux
BASH
# Actualizar base de datos (se hace automáticamente cada noche)
2$ sudo updatedb
# Buscar archivos que contengan "apache" en el nombre
$ locate apache
/etc/apache2/apache2.ctl
/usr/bin/apache2ctl
/var/log/apache2/access.log- 1
-
locatees mucho más rápido quefind - 2
-
Requiere que la BD se actualice con
updatedb
macOS
BASH
# macOS usa /var/db/locate.database
$ locate apache
/etc/apache2/apache2.ctl
/usr/local/bin/apache2ctl- 1
- La BD se actualiza automáticamente cada semana
Windows
POWERSHELL
# Windows no tiene locate nativo
# Alternativa: crear índice con Everything o:
PS> Get-ChildItem -Path C:\ -Recurse -Filter "*apache*" -ErrorAction SilentlyContinue
1- 1
- Sin herramienta especializada, es más lento
- 2
- Software como “Everything” proporciona funcionalidad similar
Cuándo usar:
- Usa
locatepara búsquedas rápidas por nombre - Usa
findpara búsquedas complejas con múltiples condiciones
Resumen de Comandos de Búsqueda
| Comando | Propósito | Velocidad | Complejidad |
|---|---|---|---|
find |
Búsqueda por metadatos | Lenta pero completa | Alta |
grep |
Búsqueda en contenido | Moderada | Media |
locate |
Búsqueda rápida por nombre | Muy rápida | Baja |
grep -r |
Búsqueda recursiva en contenido | Lenta | Media |
| Combinadas (find+grep) | Búsqueda avanzada | Lenta pero poderosa | Muy alta |
🎯 Ejercicios Prácticos
Usa
findpara localizar todos los archivos.txten tu homeUsa
greppara buscar “Linux” en todos los archivos del directorio actualBusca archivos modificados en los últimos 30 días
Encuentra archivos mayores a 10MB
Busca líneas que contengan números usando
grepcon regexCombina
findygreppara buscar “error” en todos los logs
Referencias
Para más información sobre búsqueda de archivos:
- (IEEE 2018) - POSIX File Search
- (Project 2023) - GNU Find Documentation
- (Foundation 2023) - GNU Grep Manual