Introducción al comando find
El comando find es una de las herramientas más poderosas y versátiles del entorno Linux para localizar archivos y directorios según múltiples criterios. Su capacidad de combinar pruebas, acciones y operadores lo convierte en un aliado indispensable para administradores, desarrolladores y usuarios avanzados.
Sintaxis básica
La forma más simple es find [ruta] [expresión]. Si se omite la ruta, find parte del directorio actual. Por ejemplo, find /home/usuario -name '*.txt' lista todos los archivos con extensión .txt bajo el directorio indicado.
Buscar por nombre
El predicado -name acepta patrones estilo shell. Para ignorar mayúsculas y minúsculas se usa -iname. Ejemplo: find /var/log -iname '*error*' devuelve cualquier archivo cuyo nombre contenga la palabra error, sin importar caso.
Filtrar por tipo de archivo
Con -type se especifica el tipo: f para archivo regular, d para directorio, l para enlace simbólico, b para dispositivo de bloque, c para dispositivo de carácter, p para tubería nombrada y s para socket. Ejemplo: find /etc -type f -name '*.conf' localiza solo los archivos de configuración en /etc.
Limitar por tamaño
El predicado -size permite filtrar según el peso. Los sufijos aceptados son c (bytes), k (kilobytes), M (megabytes) y G (gigabytes). Para buscar archivos mayores a 10 MB: find /home -type f -size +10M. Para archivos entre 1 y 5 MB: find /home -type f -size +1M -size -5M.
Buscar por fecha de modificación
Las opciones -mtime, -atime y -ctime trabajan en días. Un número positivo indica «más de n días», negativo «menos de n días» y cero «exactamente n días». Para archivos modificados en las últimas 24 horas: find . -mtime -1. También existen variantes en minutos: -mmin, -amin, -cmin.
Combinar criterios con operadores lógicos
Por defecto, múltiples expresiones se implican con AND. Se pueden usar explícitamente -a (AND), -o (OR) y ! o -not para negación. Ejemplo: buscar archivos .log o .txt mayores a 5 MB: find /var/log \( -name '*.log' -o -name '*.txt' \) -size +5M.
Ejecutar acciones sobre los resultados
El predicado -exec permite lanzar un comando sobre cada archivo encontrado. La sintaxis termina con ; escapada o con + para agrupar argumentos. Ejemplo de borrado seguro: find /tmp -type f -name '*.tmp' -mtime +7 -exec rm -f {} \;. Usando + se reduce la cantidad de invocaciones: find /tmp -type f -name '*.tmp' -mtime +7 -exec rm -f {} +.
Alternativa segura: -ok
Si se desea confirmar cada acción, -ok funciona igual que -exec pero pide confirmación antes de ejecutar. Útil en operaciones destructivas como borrado o cambio de permisos.
Manejo de nombres con espacios o caracteres especiales
Para evitar problemas con espacios, saltos de línea o caracteres especiales, se combina find con -print0 y xargs -0. Ejemplo: find . -type f -name '*.mp3' -print0 | xargs -0 rsync -avz /destino/.
Buscar por permisos
El predicado -perm permite localizar archivos según sus modos de permiso. Se pueden usar valores octales o simbólicos. Para encontrar archivos con permisos exactamente 644: find /var/www -type f -perm 644. Para localizar aquellos que tengan al menos el bit de ejecución para el propietario: find /usr/bin -type f -perm -u=x. El guión - antes del modo indica que se deben cumplir al menos esos bits.
Usando expresiones regulares
Además de -name, find ofrece -regex y -iregex para coincidencias con expresiones regulares. Estos operadores se aplican a la ruta completa del archivo. Por ejemplo, para encontrar archivos que terminen en .log o .txt y cuyo nombre contenga una fecha en formato AAAA-MM-DD: find /var/log -type f -regex '.*/[0-9]{4}-[0-9]{2}-[0-9]{2}\.(log|txt)$'. Nota que el punto y otros caracteres especiales deben escaparse dentro de la expresión regular.
Ejemplos prácticos cotidianos
- Listar todos los archivos vacíos:
find /home -type f -empty - Encontrar los 10 archivos más grandes:
find / -type f -exec du -h {} + | sort -rh | head -n 10 - Cambiar permisos a todos los scripts:
find /opt/scripts -type f -name '*.sh' -exec chmod 755 {} + - Eliminar archivos de caché más antiguos de 30 días:
find /var/cache -type f -mtime +30 -delete - Copiar todos los PDFs recientes a un directorio de respaldo:
find /home -type f -name '*.pdf' -mtime -7 -exec cp {} /backup/pdf/ \;
Consejos de rendimiento
Limitar la profundidad de búsqueda con -maxdepth y -mindepth evita recorrer directorios innecesarios. Por ejemplo, buscar solo en los dos primeros niveles: find /var/www -maxdepth 2 -type f -name '*.php'. Además, usar -prune permite excluir subárboles específicos: find / -type d -name 'proc' -prune -o -type f -name '*.log' -print omite el directorio /proc.
Conclusión
Dominar find es esencial para cualquier administrador o usuario avanzado de Linux. Su flexibilidad permite desde simples búsquedas de nombre hasta complejas operaciones combinadas con otros comandos mediante -exec o tuberías. Practicar los ejemplos presentados y consultar la página de manual (man find) consolidará el conocimiento.