Linux

Linux: ¿cómo puedo utilizar find para buscar archivos por fecha?

I. Presentación

En este tutorial, veremos cómo ordenar archivos por fecha utilizando el comando find en Linux.

Find es un comando nativo de los sistemas UNIX (forma parte del estándar POSIX). Es un comando muy útil cuando se utiliza mucho el terminal, ya que permite buscar archivos y carpetas en todo el sistema según diversos criterios.

Este comando tiene varias opciones de filtrado y búsqueda. Aquí nos centraremos en la búsqueda por fecha, que puede ser la fecha en que se modificó o accedió por última vez a un archivo o carpeta. Este tipo de búsqueda es particularmente útil cuando tienes un gran número de archivos (normalmente logs) o quieres investigar un periodo específico (antes o después de un evento).

II. Atributos avanzados de archivos y carpetas

En Linux, todos los archivos y carpetas tienen atributos. Algunos de ellos son bien conocidos, como el tipo (archivo, socket, carpeta, enlace simbólico, etc.), permisos (como rwxrwxr-x), fecha de última modificación, propietario y grupo de propietarios. Estos atributos se muestran utilizando la opción -a del comando ls :

Visualización de los atributos "clásicos" de los archivos en Linux mediante el comando ls.
Visualización de los atributos "clásicos" de los archivos en Linux mediante el comando ls.

Pero hay otros atributos que suelen ser menos conocidos. Entre ellos se encuentran la fecha del último acceso y el número de inodo. Esta información se puede listar utilizando el comando stat :

Muestra los atributos avanzados de los archivos en Linux mediante el comando stat.
Muestra los atributos avanzados de los archivos en Linux mediante el comando stat.

Ahora que sabemos que existen estos atributos de modificación y acceso, veremos cómo utilizarlos en un filtro utilizando el comando find.

Más adelante veremos que el campo "creado" no es del todo fiable, o incluso inexistente en algunos sistemas de archivos. Por eso el comando find no ofrece una opción para filtrar por fecha de creación.

III. La sintaxis del comando find

Una búsqueda clásica utilizando el comando find podría tener este aspecto:

find /home/mickael/ -type f -name *.txt

Este comando me permite buscar todos los archivos que terminan en .txt en el directorio /home/mickael. En cuanto a las opciones de filtrado temporal, podemos buscar archivos modificados o a los que se haya accedido después de un determinado número de días, antes de un determinado número de días y precisamente hace un determinado número de días. Esto se consigue utilizando las siguientes notaciones:

  • +N más de N días
  • -N menos de N días
  • N exactamente N días

Esto será más fácil de entender con la información que sigue.

A. Búsqueda de archivos por fecha de modificación

También podemos buscar por la fecha en que un archivo fue modificado por última vez. Esto es especialmente útil para averiguar si una configuración ha sido modificada recientemente, y puede utilizarse para comprobar la integridad de un fichero. Utilizaremos la opción -mtime, por ejemplo, para mostrar los archivos modificados hace más de 30 días (1 mes):

# Mostrar archivos .txt creados hace más de 30 días
$ find /home/mickael -type f -name "*.txt"  -mtime +30

Por el contrario, si estoy interesado en archivos creados hace menos de un mes :

# Mostrar archivos .txt creados hace más de 30 días
$ find /home/mickael -type f -name "*.txt"  -mtime -30

Observe la diferencia entre +30 y -30. La opción mtime, para "tiempo de modificación", sólo muestra los archivos cuya última modificación se produjo hace más o menos del número de días dado.

B. Búsqueda de archivos por fecha de acceso

También podemos utilizar un filtro basado en la fecha de último acceso de un archivo utilizando la opción -atime:

# Mostrar archivos .txt creados hace más de 1 día
$ find /home/mickael -type f -name "*.txt"  -atime +1

Por el contrario, si son archivos creados hace menos de un día los que me interesan :

# Mostrar archivos .txt creados hace más de 1 día
$ find /home/mickael -type f -name "*.txt"  -atime -1

La opción atime para "tiempo de acceso" se utiliza para mostrar sólo los archivos cuyo último acceso (lectura) es anterior o inferior al número de días dado.

Por supuesto, todos estos comandos también se aplican a las carpetas. En este caso, sustituya -type f por -type d.

C. Filtrar por minutos en lugar de por horas

En mi último ejemplo, utilizamos el valor mínimo posible para las opciones atime y mtime, es decir, 1 día. Sin embargo, a veces puede ser útil filtrar en escalas de tiempo más pequeñas, como minutos.

El comando find contiene opciones para hacerlo. En realidad son las mismas que las vistas anteriormente, salvo que la palabra time debe sustituirse por min :

  • Utilice amin en lugar de atime para filtrar por fecha de último acceso en minutos.
  • Utilice mmin en lugar de mtime para filtrar por fecha de última modificación en minutos.

He aquí algunos ejemplos:

# Mostrar archivos .txt modificados hace menos de 30 minutos
find /home/mickael -type f -name "*.txt"  -mmin -30

# Mostrar los archivos .txt a los que se ha accedido hace más de 30 minutos
find /home/mickael -type f -name "*.txt"  -amin +30

Por lo tanto, las dos únicas escalas de tiempo que se pueden utilizar con find son el minuto (mmin, amin) y el día (mtime, atime), que suele ser suficiente.

¿Y la fecha de creación?

La documentación y la ayuda del comando find también ofrecen las opciones -ctime y <-cmin. Podrías pensar que la "c" aquí significa "creación", pero no es así. Estas opciones se refieren a cambios de estado (o metadatos) y no a la creación de archivos. Para los sistemas de archivos Linux comunes, la fecha de creación no siempre está disponible o es fiable, por lo que no hay opciones en find para filtrarla.

He aquí un ejemplo:

Demostración de la opción -cmin (o -ctime) para la fecha de cambio de estado.
Demostración de la opción -cmin (o -ctime) para la fecha de cambio de estado.

Aquí, mi archivo document2.txt se creó el 2025-03-04 a las 21:01:39 como indica el comando stat. Modifico el contenido de este archivo el 2025-03-04 a las 21:23:03, y vuelvo a comprobar los atributos avanzados con stat. Se ha modificado la fecha de modificación, no la fecha de creación (que es lo normal). A continuación, uso el comando find con la opción -cmin para filtrar los archivos cuyo estado ha cambiado hace más de tres minutos, y mi document2.txt no aparece.

Si la opción -cmin fuera válida para la creación (que no es el caso), mi document2.txt debería haber aparecido, ya que se creó hace más de tres minutos. Este es un escollo a tener en cuenta si quieres usar el comando findde forma efectiva.

Más concretamente, esto también permite identificar los cambios en los permisos de un fichero. Al cambiar los permisos, el propietario o el grupo de un fichero no cambia la fecha de la última modificación o acceso, sino la fecha del cambio. Esto puede ser útil en varios contextos.

IV. Búsqueda por hora

Si se conoce la hora y la fecha exactas que interesan, o incluso el intervalo de tiempo, se puede utilizar como filtro de búsqueda. Si la búsqueda debe realizarse en un momento concreto, podemos utilizar -newerXt con una fecha y hora. Aquí el X puede ser un a (acceso), un m (modificación) o un c (cambio) :

# Mostrar archivos con metadatos modificados después del 03/03/2025
find ./ -newerct "2025-03-03"

# Mostrar ficheros modificados antes del 03/03/2025 (búsqueda inversa con !)
find ./  ! -newermt "2025-03-03"

# Mostrar los archivos a los que se ha accedido después de las 21:00 del 03/03/2025
find ./  -newerat "2025-03-03 21:00:00"

Las opciones aquí son muy similares, pero ten en cuenta las sutiles diferencias que diferencian entre cambios de metadatos, modificaciones y acceso (fin de la opción como at, cto mt).

Como puede ver en estos ejemplos, también es posible realizar una búsqueda inversa o de exclusión (búsqueda de archivos anteriores a una fecha especificada) utilizando el carácter !. También podemos especificar la hora, el minuto y el segundo en nuestro filtro para ser mucho más precisos.

V. Conclusión

Todas estas opciones hacen del comando find una herramienta muy potente. Conocerlas y dominarlas significa que en muchos casos no necesitas hacer scripts ni instalar herramientas de terceros. Las opciones de filtrado de tiempo que acabamos de ver pueden utilizarse, por supuesto, en combinación con las demás opciones del comando find, por ejemplo :

# Busca archivos terminados en ".log", modificados hace menos de 7 días y de más de 1 MB en el directorio /var/log.
find /var/log -type f -name "*.log" -mtime -7 -size +1M

Por último, es importante tener en cuenta que los atributos avanzados de los archivos pueden modificarse manualmente, lo que significa que no siempre son fiables al 100%. Esta es una consideración importante en el ámbito de la ciberseguridad, donde la manipulación de estos atributos puede utilizarse para ocultar actividades maliciosas.

Te recomiendo que eches un vistazo a las opciones avanzadas de find ¡además de lo que acabamos de ver! Siéntase libre de compartir sus pensamientos sobre este tutorial en los comentarios en nuestro servidor Discord.

author avatar
Mickaël Dorigny Co-founder
Co-founder of IT-Connect. Auditor/Pentester at Orange Cyberdéfense.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.