Búsqueda de Archivos y Contenido

Author

Diego Saavedra

Published

January 29, 2024

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
-name busca 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-ChildItem con -Filter y -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 +100M busca 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 -File y Where-Object con 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 d busca solo directorios
2
-empty busca 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
-Pattern es 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
-r busca 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
-Recurse es el equivalente a -r de 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
-i ignora mayúsculas
2
-n muestra 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 -CaseSensitive es case-insensitive por defecto

Ejemplo 4: Contar coincidencias (grep -c)

BASH
$ grep -c "Failed password" /var/log/auth.log
42
1
-c solo 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
# Buscar líneas que comienzan con Error o Warning
$ grep -E "^(Error|Warning)" /var/log/app.log
Error: Database connection failed
Warning: Memory usage high
Error: API timeout
1
2
1
-E habilita 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
-exec ejecuta un comando en cada resultado
2
xargs pasa 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
locate es mucho más rápido que find
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 locate para búsquedas rápidas por nombre
  • Usa find para 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

  1. Usa find para localizar todos los archivos .txt en tu home

  2. Usa grep para buscar “Linux” en todos los archivos del directorio actual

  3. Busca archivos modificados en los últimos 30 días

  4. Encuentra archivos mayores a 10MB

  5. Busca líneas que contengan números usando grep con regex

  6. Combina find y grep para buscar “error” en todos los logs


Referencias

Para más información sobre búsqueda de archivos:

Code Appendix

Foundation, Free Software. 2023. “GNU Grep Manual.” 2023.
IEEE. 2018. “POSIX.1-2017 Portable Operating System Interface.” 2018.
Project, GNU. 2023. “GNU Find Documentation.” 2023.