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.

Esta entrada está disponible también en ENGLISH.

Esta obra está bajo una Licencia Creative Commons Atribución 4.0 Internacional para Francesc Roig francesc@vivaldi.net .