Comando find en Linux: buscar archivos por nombre, tamaño y fecha con ejemplos
El comando find recorre el árbol de directorios y selecciona archivos según condiciones: find /ruta -name '*.log' busca por nombre, -type f solo archivos, -size +100M los de más de 100 MB y -mtime -7 los modificados en la última semana. Las condiciones se combinan, y sobre los resultados se puede ejecutar una acción con -exec, -delete o pasar la lista a xargs.
El comando find recorre el árbol de directorios y localiza archivos según condiciones: nombre, tipo, tamaño, fecha de modificación, propietario y permisos. El esquema general es find [dónde buscar] [condiciones] [acción]. A continuación reunimos ejemplos de find en Linux para tareas habituales: encontrar un archivo de configuración, borrar logs antiguos o averiguar qué está ocupando el disco.
Sintaxis del comando find
find /var/log -type f -name '*.log' -mtime +30 -print
Por partes:
/var/loges el punto de partida. Se pueden indicar varios directorios seguidos o.(el actual). Sin ruta, GNU find busca en el directorio actual.-type f -name '*.log' -mtime +30son las condiciones (en la documentación se llaman «pruebas»). Entre ellas se aplica por defecto un «Y» lógico.-printes la acción: mostrar la ruta. Se añade automáticamente si no hay otras acciones.
find recorre todos los subdirectorios de forma recursiva. Si lo ejecuta un usuario normal sobre rutas del sistema, la salida se llenará de líneas Permission denied. Para eliminarlas, redirija el flujo de errores:
find / -name 'nginx.conf' 2>/dev/null
Búsqueda por nombre: -name e -iname
La condición -name compara solo el nombre del archivo (sin la ruta) con un patrón. El patrón admite * (cualquier secuencia de caracteres), ? (un carácter) y [abc] (uno de los indicados).
# nombre exacto
find /etc -name 'hosts'
# todos los archivos .conf
find /etc -name '*.conf'
# sin distinguir mayúsculas: README.md, readme.MD, Readme.md
find ~/proyectos -iname 'readme.md'
# report_1.csv ... report_9.csv
find . -name 'report_?.csv'
Ponga siempre el patrón entre comillas. Sin ellas, el shell expandirá *.conf con los archivos del directorio actual, find recibirá una lista de nombres en lugar de un patrón, y el resultado será inesperado o el comando fallará con el error paths must precede expression.
Búsqueda por ruta: -path y -regex
Si importa el directorio y no solo el nombre, use -path, que compara el patrón con la ruta completa:
# archivos .js solo dentro de directorios src
find . -path '*/src/*' -name '*.js'
Para patrones complejos existe -regex (la expresión regular también se aplica a la ruta completa) y -iregex, que no distingue mayúsculas:
find . -regextype posix-extended -regex '.*\.(jpg|jpeg|png)$'
Cómo excluir un directorio
Para que find no entre, por ejemplo, en node_modules o .git, se usa -prune:
find . -path ./node_modules -prune -o -name '*.js' -print
Se lee así: «si la ruta es ./node_modules, no bajar en ella; si no (-o), mostrar los archivos *.js». El -print final es obligatorio; si no, en la salida aparecerá también el propio directorio excluido. Una alternativa más sencilla, pero más lenta, es -not -path '*/node_modules/*': find recorre el directorio igualmente y solo filtra el resultado.
Búsqueda por tipo: -type
| Valor | Qué busca |
|---|---|
-type f | archivos normales |
-type d | directorios |
-type l | enlaces simbólicos |
-type s | sockets |
-type p | tuberías con nombre (FIFO) |
# solo directorios llamados logs
find / -type d -name 'logs' 2>/dev/null
# archivos y directorios vacíos
find . -type f -empty
find . -type d -empty
# enlaces simbólicos rotos
find . -xtype l
Búsqueda por tamaño: -size
La condición -size acepta un número con sufijo: c para bytes, k para kilobytes, M para megabytes y G para gigabytes. El signo + significa «más de», - significa «menos de», y sin signo, «exactamente».
# archivos de más de 100 MB en todo el sistema
find / -type f -size +100M 2>/dev/null
# entre 10 y 50 MB
find . -type f -size +10M -size -50M
# menos de 1 KB
find . -type f -size -1k
Hay un matiz: el tamaño se redondea hacia arriba a la unidad elegida. Por eso -size -1M encuentra solo los archivos vacíos: cualquier archivo no vacío ocupa «al menos 1 megabyte» tras el redondeo. Para límites exactos use unidades menores: -size -1024k.
Qué ocupa espacio en el disco
La combinación de find con ls y sort muestra los archivos más grandes:
find /var -type f -size +50M -exec ls -lh {} + 2>/dev/null | sort -k5 -rh | head
-rw-r----- 1 syslog adm 1.2G Oct 14 09:12 /var/log/syslog.1
-rw-r--r-- 1 root root 412M Oct 10 03:00 /var/backups/db.sql.gz
-rw-r----- 1 root adm 96M Oct 14 09:15 /var/log/nginx/access.log
Para estimar directorios completos es más cómodo du -sh; find es útil cuando el espacio lo ocupa un único archivo enorme en lo profundo del árbol.
Búsqueda por fecha: -mtime, -mmin, -newer
Cada archivo tiene tres marcas de tiempo, y find permite filtrar por cualquiera de ellas:
| Condición | Marca | Unidad |
|---|---|---|
-mtime / -mmin | modificación del contenido | días / minutos |
-atime / -amin | última lectura | días / minutos |
-ctime / -cmin | cambio de metadatos (permisos, propietario, nombre) | días / minutos |
Los signos funcionan igual que con el tamaño: -mtime -7 significa modificado hace menos de 7 días, y -mtime +30, hace más de 30 días.
# modificados en la última semana
find ~/proyectos -type f -mtime -7
# logs con más de 30 días
find /var/log -type f -name '*.log' -mtime +30
# modificados en los últimos 15 minutos
find /etc -type f -mmin -15
Los días se cuentan como periodos completos de 24 horas y la parte fraccionaria se descarta. Por eso -mtime +1 encuentra los archivos con más de 48 horas, no de 24: es una trampa frecuente. Si necesita precisión, use minutos: -mmin +1440.
Archivos más recientes que otro archivo o que una fecha
# modificados después de la última modificación de deploy.lock
find . -type f -newer deploy.lock
# modificados después de una fecha concreta (GNU find)
find . -type f -newermt '2026-10-01'
# dentro de un intervalo de fechas
find . -type f -newermt '2026-10-01' ! -newermt '2026-10-08'
Búsqueda por propietario y permisos
# archivos del usuario alice
find /home -user alice
# archivos sin propietario existente (tras borrar un usuario)
find / -nouser 2>/dev/null
# archivos con permisos exactamente 777
find /var/www -type f -perm 777
# archivos con escritura para todos
find /var/www -perm -o=w
# archivos con el bit SUID, útil en auditorías de seguridad
find / -perm -4000 -type f 2>/dev/null
El flag -perm tiene tres formas: sin signo, los permisos coinciden exactamente; con -, deben estar activos al menos todos los bits indicados; con /, basta con que esté activo al menos uno de ellos.
Lógica de las condiciones: Y, O, NO
Las condiciones se combinan por defecto con «Y». Para «O» se usa -o, y para negar, ! o -not. La agrupación se hace con paréntesis, que hay que escapar para el shell:
# imágenes jpg o png
find . -type f \( -name '*.jpg' -o -name '*.png' \)
# todo excepto los archivos .tmp
find . -type f ! -name '*.tmp'
Sin paréntesis, -type f se aplicaría solo a la primera condición de la pareja «O», y en el resultado aparecerían directorios llamados *.png. Los espacios alrededor de \( y \) son obligatorios.
Profundidad de la búsqueda: -maxdepth y -mindepth
# solo en el directorio actual, sin subdirectorios
find . -maxdepth 1 -type f -name '*.sh'
# desde el segundo nivel de anidamiento
find . -mindepth 2 -name '*.md'
# no cambiar a otros sistemas de archivos
find / -xdev -type f -size +1G
Escriba -maxdepth justo después de la ruta, antes de las demás condiciones; si no, GNU find mostrará una advertencia. La opción -xdev es útil al buscar desde /: find no entrará en /proc, ni en discos de red o montados.
Acciones sobre lo encontrado: -exec, -delete, xargs
-exec: ejecutar un comando para cada archivo
En lugar de {}, find pondrá la ruta de cada archivo. El comando termina con \; o con +:
# una ejecución por archivo
find . -name '*.sh' -exec chmod +x {} \;
# todos los archivos en una sola lista, más rápido
find . -name '*.log' -exec gzip {} +
# pidiendo confirmación para cada archivo
find . -name '*.bak' -ok rm {} \;
La variante con + agrupa las rutas en lotes y ejecuta el comando mucho menos veces, así que con miles de archivos es varias veces más rápida. La variante con \; es necesaria cuando el comando acepta un solo archivo o cuando {} no está al final.
-delete: eliminar lo encontrado
# primero, revisar qué se eliminaría
find /tmp/build -type f -name '*.o' -mtime +7
# después, eliminar
find /tmp/build -type f -name '*.o' -mtime +7 -delete
Ejecute siempre primero el comando sin -delete y revise la lista. Coloque -delete al final: find evalúa la expresión de izquierda a derecha, y find . -delete -name '*.o' borraría todo el directorio antes de comprobar el nombre.
find y xargs
La combinación clásica consiste en pasar la lista de archivos a otro programa mediante xargs. Para no fallar con nombres que contienen espacios, use como separador el byte nulo:
find . -type f -name '*.txt' -print0 | xargs -0 wc -l
El flag -P de xargs ejecuta el procesamiento en paralelo:
find ./images -name '*.png' -print0 | xargs -0 -P 4 -n 10 optipng
find y grep: buscar texto dentro de los archivos
find busca archivos, no su contenido. Para encontrar una cadena dentro de los archivos seleccionados, pásela a grep:
# dónde aparece listen 8080 en los archivos de configuración
find /etc/nginx -type f -name '*.conf' -exec grep -Hn 'listen 8080' {} +
/etc/nginx/sites-enabled/app.conf:4: listen 8080;
El flag -H muestra el nombre del archivo, -n el número de línea, y grep -l muestra solo los nombres de los archivos con coincidencias. Si solo necesita filtrar por extensión, basta con grep: grep -rn --include='*.conf' 'listen 8080' /etc/nginx.
Formato de salida propio: -printf
GNU find puede mostrar más que la ruta. Por ejemplo, el tamaño, la fecha y el nombre:
find . -maxdepth 1 -type f -printf '%s\t%TY-%Tm-%Td\t%p\n' | sort -n
Aquí %s es el tamaño en bytes, %T... la fecha de modificación por partes y %p la ruta. Es útil en scripts, porque no hace falta analizar la salida de ls.
Chuleta: ejemplos de find en Linux para cada día
| Tarea | Comando |
|---|---|
| Buscar un archivo por nombre | find / -name 'archivo.txt' 2>/dev/null |
| Sin distinguir mayúsculas | find . -iname '*.jpg' |
| Solo directorios | find . -type d -name 'cache' |
| Archivos de más de 1 GB | find / -xdev -type f -size +1G |
| Modificados en el último día | find . -type f -mtime -1 |
| Modificados en la última hora | find . -type f -mmin -60 |
| Borrar logs de más de 30 días | find /var/log/app -name '*.log' -mtime +30 -delete |
| Directorios vacíos | find . -type d -empty |
| Cambiar permisos de todos los directorios | find . -type d -exec chmod 755 {} + |
| Texto dentro de los archivos | find . -name '*.py' -exec grep -l 'TODO' {} + |
| Contar archivos | find . -type f | wc -l |
Errores habituales
- Patrón sin comillas.
find . -name *.logfalla si en el directorio actual hay algún archivo.log. Escriba'*.log'. - Avalancha de Permission denied. Añada
2>/dev/nullo ejecute consudosi de verdad necesita recorrer todo el disco. -deletefuera de lugar. Siempre va al final, y antes conviene hacer una ejecución de prueba sin borrar.- Nombres con espacios en un pipeline.
find ... | xargs rmpartirá «Mi archivo.txt» en dos argumentos. Use-print0conxargs -0, o-exec. - Esperar días exactos de
-mtime. Para intervalos exactos use-mmino-newermt.
Resumen
find es una herramienta universal para buscar en el sistema de archivos: ruta, condiciones de nombre, tipo, tamaño, fecha y permisos, y después la acción. Domine cinco pilares (-name, -type, -size, -mtime y -exec ... +) y la mayoría de tareas se resolverán con una sola línea. Repita estos ejemplos de find en Linux en su terminal, y la combinación de find con grep, sed y awk la practicamos en la lección del curso de Linux sobre el procesamiento de texto en la terminal.
Preguntas frecuentes
¿En qué se diferencia find de locate?
locate busca en una base de datos de nombres creada previamente, por eso responde al instante, pero no ve los archivos creados después de la última actualización de la base con updatedb. find recorre el disco en tiempo real y permite filtrar por tamaño, fecha y permisos.
¿Cómo encontrar un archivo por su contenido y no por su nombre?
find no lee el contenido. Use grep -rn 'texto' /ruta o la combinación find . -name '*.conf' -exec grep -l 'texto' {} +.
¿Por qué find es lento al buscar desde la raíz del disco?
Recorre todos los directorios, incluidos /proc, /sys y los discos montados. Limite la búsqueda a un directorio concreto, añada -xdev y -maxdepth, o excluya lo innecesario con -prune.
¿Se pueden ordenar los resultados de find por fecha?
Sí: find . -type f -printf '%T@ %p\n' | sort -n muestra los archivos de más antiguos a más recientes, donde %T@ es la hora de modificación en segundos desde la época Unix.
¿Cómo encontrar y eliminar directorios vacíos?
El comando find . -type d -empty -delete elimina todos los directorios vacíos, incluidos los que quedaron vacíos tras borrar sus subdirectorios. Ejecútelo primero sin -delete y revise la lista.
Este tema se explica a fondo y con práctica en el curso «Linux: с нуля до уверенного администрирования».
Ir al curso