find + xargs: busca archivos como un profesional y ejecuta comandos en lote
Más allá de find . -name
El 90% de los tutoriales de find se quedan en buscar por nombre. Pero find tiene filtros por tamaño, fecha, permisos, tipo, profundidad y dueño. Y combinado con xargs, procesa miles de archivos sin reventar la línea de comandos.
Filtrar por nombre
# Búsqueda exacta
find /var/log -name "syslog"
# Con comodines (case sensitive)
find . -name "*.log"
# Case insensitive
find . -iname "*.jpg"
# Excluir un directorio
find . -name "*.tmp" -not -path "./.git/*"
Filtrar por tipo
# Solo archivos regulares
find . -type f
# Solo directorios
find . -type d
# Solo enlaces simbólicos
find . -type l
Filtrar por tamaño
# Archivos mayores de 100 MB
find /var -type f -size +100M
# Archivos entre 1 MB y 10 MB
find . -type f -size +1M -size -10M
# Archivos vacíos (0 bytes)
find . -type f -size 0
Filtrar por fecha
# Modificados en las últimas 24 horas
find . -type f -mtime -1
# Modificados hace más de 30 días (candidatos a borrar)
find /tmp -type f -mtime +30
# Accedidos en los últimos 7 días
find . -type f -atime -7
# Usa -mmin para minutos en vez de días
find . -type f -mmin -60
Filtrar por permisos y dueño
# Archivos con permisos 777 (peligroso)
find /var/www -type f -perm 0777
# Archivos que pertenecen a root pero están en mi home
find ~ -type f -user root
# Archivos con SUID activado
find / -type f -perm -4000 2>/dev/null
Combinar con xargs
El problema de find ... -exec es que ejecuta un proceso por cada archivo. Con miles de archivos, es lentísimo. xargs agrupa:
# Borrar todos los .tmp (agrupando de a 100)
find /tmp -name "*.tmp" -type f -print0 | xargs -0 -n 100 rm
# Buscar texto en todos los .log
find /var/log -name "*.log" -print0 | xargs -0 grep -l "ERROR"
# Cambiar permisos de todos los .sh
find . -name "*.sh" -print0 | xargs -0 chmod +x
El -print0 y -0 son obligatorios. Sin ellos, los nombres de archivo con espacios o saltos de línea rompen el comando.
Buscar y ejecutar en paralelo
# Comprimir todos los .log mayores de 10 MB en paralelo
find /var/log -name "*.log" -size +10M -print0 | xargs -0 -P 4 -n 1 gzip
-P 4 ejecuta 4 procesos en paralelo. Con cientos de archivos, la diferencia es abismal.
find sin xargs es un localizador. Con xargs, es un procesador batch. La combinación -print0 | xargs -0 nunca falla, sin importar qué caracteres raros tengan los nombres de archivo.