Guía completa para usar el comando find en Linux

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.