Automatización Linux, scripting Bash y herramientas para sysadmins

find + xargs: busca archivos como un profesional y ejecuta comandos en lote

#linux#find#command-line#bash

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.