# Referencia Rápida de find

*Búsqueda de archivos por nombre, tipo, tamaño, tiempo, permisos y acciones*

> Source: GNU Findutils (gnu.org/software/findutils) · MIT

## Búsqueda básica

### Ejecutar find

```
find .                              # listar todos los archivos recursivamente
find /var/log                       # buscar desde ruta específica
find . -name "*.txt"               # buscar por nombre
find / -name "config" 2>/dev/null  # suprimir errores de permisos
find dir1 dir2 -name "*.py"        # buscar en múltiples directorios
```

### Resumen de sintaxis

| Command | Description |
|---------|-------------|
| `find [path...] [tests] [actions]` | Forma general — rutas, luego tests, luego acciones |
| `path` | Directorio de inicio (por defecto: directorio actual) |
| `test` | Condición para filtrar archivos (`-name`, `-type`, etc.) |
| `action` | Qué hacer con los resultados (`-print`, `-exec`, etc.) |
| `Acción por defecto` | `-print` si no se especifica acción |

## Patrones de nombre

### Coincidencia de nombre

```
find . -name "*.log"               # glob con distinción de mayúsculas
find . -iname "readme*"            # glob sin distinción de mayúsculas
find . -name "*.py" -o -name "*.js"  # O: archivos Python o JS
find . -path "*/src/*.ts"          # coincidir con ruta completa
find . -regex '.*\.\(py\|js\)'    # regex POSIX en ruta completa
```

### Tests de nombre

| Command | Description |
|---------|-------------|
| `-name pattern` | Nombre base coincide con glob (distingue mayúsculas) |
| `-iname pattern` | Nombre base coincide con glob (sin distinguir) |
| `-path pattern` | Ruta completa coincide con glob |
| `-ipath pattern` | Ruta completa coincide con glob (sin distinguir) |
| `-regex pattern` | Ruta completa coincide con expresión regular |
| `-iregex pattern` | Ruta completa coincide con regex (sin distinguir) |

## Filtros de tipo

### Filtrar por tipo

```
find . -type f                     # solo archivos regulares
find . -type d                     # solo directorios
find . -type l                     # enlaces simbólicos
find . -type f -name "*.sh"        # combinar tipo + nombre
```

### Tipos de archivo

| Command | Description |
|---------|-------------|
| `-type f` | Archivo regular |
| `-type d` | Directorio |
| `-type l` | Enlace simbólico |
| `-type b` | Dispositivo de bloque |
| `-type c` | Dispositivo de caracteres |
| `-type p` | Tubería con nombre (FIFO) |
| `-type s` | Socket |
| `-empty` | Archivo o directorio vacío |

## Tamaño y tiempo

### Ejemplos de tamaño y tiempo

```
find . -size +100M                 # mayor de 100 MB
find . -size -1k                   # menor de 1 KB
find . -mtime -7                   # modificado en los últimos 7 días
find . -mmin -30                   # modificado en los últimos 30 minutos
find . -newer reference.txt        # más reciente que el archivo de referencia
```

### Tests de tamaño y tiempo

| Command | Description |
|---------|-------------|
| `-size +/-Nc` | Tamaño en bytes (c), kilobytes (k), megabytes (M), gigabytes (G) |
| `-mtime +/-N` | Modificado hace N*24 horas (+más antiguo, -más reciente) |
| `-atime +/-N` | Accedido hace N*24 horas |
| `-ctime +/-N` | Estado cambiado hace N*24 horas |
| `-mmin +/-N` | Modificado hace N minutos |
| `-newer file` | Modificado más recientemente que el archivo |
| `-newermt date` | Modificado después de la cadena de fecha (GNU) |

## Permisos

### Ejemplos de permisos

```
find . -perm 644                   # permisos exactos: rw-r--r--
find . -perm -u+x                  # usuario tiene bit de ejecución
find . -perm /o+w                  # otros tienen escritura (cualquier coincidencia)
find . -user root                  # propiedad de root
find . -group www-data -type f     # propiedad del grupo
```

### Tests de permisos

| Command | Description |
|---------|-------------|
| `-perm mode` | Coincidencia exacta de permisos |
| `-perm -mode` | Todos los bits especificados están activos |
| `-perm /mode` | Cualquier bit especificado está activo |
| `-user name` | Propiedad del usuario (nombre o UID) |
| `-group name` | Propiedad del grupo (nombre o GID) |
| `-nouser` | Sin usuario coincidente en /etc/passwd |
| `-nogroup` | Sin grupo coincidente en /etc/group |

## Acciones

### Ejemplos de acciones

```
find . -name "*.log" -print        # imprimir rutas (por defecto)
find . -name "*.tmp" -delete       # eliminar archivos coincidentes
find . -type f -ls                 # listado detallado
find . -name "*.txt" -print0       # salida delimitada por nulo
find . -type f -printf "%p %s\n"   # formato personalizado (GNU)
```

### Referencia de acciones

| Command | Description |
|---------|-------------|
| `-print` | Imprimir ruta (delimitado por salto de línea) |
| `-print0` | Imprimir ruta (delimitado por nulo, seguro para xargs) |
| `-ls` | Imprimir detalles del archivo (como `ls -dils`) |
| `-delete` | Eliminar archivos coincidentes (implica `-depth`) |
| `-printf format` | Formato de salida personalizado (GNU): `%p` ruta, `%s` tamaño, `%t` tiempo |
| `-fprint file` | Escribir rutas en archivo |
| `-quit` | Salir después de la primera coincidencia |

## Combinar tests

### Operadores lógicos

```
find . -name "*.py" -type f         # Y implícito
find . -name "*.py" -a -size +10k   # Y explícito
find . -name "*.py" -o -name "*.js" # O
find . ! -name "*.log"              # NO
find . \( -name "*.py" -o -name "*.js" \) -type f
```

### Referencia de operadores

| Command | Description |
|---------|-------------|
| `expr1 expr2 / expr1 -a expr2` | Y — ambas deben ser verdaderas (por defecto) |
| `expr1 -o expr2` | O — cualquiera debe ser verdadera |
| `! expr / -not expr` | NO — negar la expresión |
| `\( expr \)` | Agrupar expresiones (escapar paréntesis en shell) |
| `Orden de evaluación` | De izquierda a derecha; `-a` tiene mayor precedencia que `-o` |

## Exec y eliminación

### Ejemplos de exec

```
find . -name "*.sh" -exec chmod +x {} \;
find . -name "*.log" -exec rm {} +
find . -type f -exec grep -l "TODO" {} +
find . -name "*.bak" -ok rm {} \;   # confirmar antes de cada uno
find . -name "*.tmp" -print0 | xargs -0 rm
```

### Referencia de exec

| Command | Description |
|---------|-------------|
| `-exec cmd {} \;` | Ejecutar cmd una vez por archivo (`{}` = ruta del archivo) |
| `-exec cmd {} +` | Ejecutar cmd con múltiples archivos a la vez (más rápido) |
| `-ok cmd {} \;` | Como `-exec` pero pide confirmación |
| `-execdir cmd {} \;` | Ejecutar cmd desde el directorio del archivo |
| `xargs -0` | Combinar con `-print0` para procesamiento seguro en lote |
| `-delete` | Eliminar archivos; procesar primero los más profundos |

## Profundidad y poda

### Ejemplos de profundidad y poda

```
find . -maxdepth 1 -type f          # solo directorio actual
find . -mindepth 2 -name "*.py"     # omitir nivel superior
find . -name ".git" -prune -o -print # omitir dirs .git
find . -depth -name "*.tmp" -delete  # procesar hijos primero
```

### Opciones de profundidad

| Command | Description |
|---------|-------------|
| `-maxdepth N` | Descender como máximo N niveles (0 = solo ruta inicial) |
| `-mindepth N` | No aplicar tests en niveles menores que N |
| `-depth` | Procesar contenidos del directorio antes que el propio directorio |
| `-prune` | No descender en el directorio coincidente |
| `-mount / -xdev` | No cruzar límites de sistemas de archivos |
| `-follow / -L` | Seguir enlaces simbólicos |

## Patrones comunes

### One-liners

```
find . -name "*.pyc" -delete             # limpiar bytecode Python
find . -type f -size 0 -delete            # eliminar archivos vacíos
find . -mtime +30 -name "*.log" -delete   # purgar logs antiguos
find . -type f -name "*.md" | wc -l       # contar archivos Markdown
find . -type d -empty -delete             # eliminar dirs vacíos
```

### Recetas

| Command | Description |
|---------|-------------|
| `Encontrar archivos más grandes` | `find . -type f -printf '%s %p\n' \| sort -rn \| head` |
| `Encontrar duplicados por nombre` | `find . -type f \| awk -F/ '{print $NF}' \| sort \| uniq -d` |
| `Renombrar extensión` | `find . -name '*.txt' -exec rename 's/.txt/.md/' {} +` |
| `Encontrar enlaces simbólicos rotos` | `find . -xtype l` |
| `Archivar archivos recientes` | `find . -mtime -7 -print0 \| tar czf recent.tar.gz --null -T -` |
| `Buscar en archivos de código` | `find . -name '*.py' -exec grep -l 'pattern' {} +` |
