A veces es útil conocer qué archivos fueron modificados en las últimas 24 horas. Puede ser porque sea necesario monitorear un directorio, porque se está realizando una auditoría sobre un sistema, se desea determinar si han cambiado archivos para crear un nuevo backup, o se necesite comprobar que una aplicación esté funcionando correctamente. Para llevar a cabo este trabajo se debe recurrir a find.



Tal como había explicado someramente en el artículo Cómo buscar archivos por nombre, la opción -mtime permite aplicar criterios de búsqueda relativos a la fecha de modificación de los archivos y directorios. Veamos que dice el manual de find (man find). Voy a mostrar sólo algunas partes del manual que me interesan:

       Numeric arguments can be specified as

       +n     for greater than n,

       -n     for less than n,

       n      for exactly n.

Esta sección explica que la sintaxis para realizar un test sobre un argumento numérico n es: +n si se desean obtener sólo resultados mayores a n (>n); -n si se desean obtener sólo resultados menores a n (<n); o n si se desean obtener resultados que sean exactamente iguales a n.

       -mtime n
              File’s  data was last modified n*24 hours ago.  See the comments
              for -atime to understand how rounding affects the interpretation
              of file modification times.

La opción -mtime filtra los resultados para que sólo se obtengan los archivos/directorio cuyos datos fueron modificados por última vez hace n días (n*24 horas). Se observa que remite a los comentarios en la opción -atime para entender cómo interpreta los períodos de 24 horas.

       -atime n
              File  was  last  accessed n*24 hours ago.  When find figures out
              how many 24-hour periods ago the file  was  last  accessed,  any
              fractional part is ignored, so to match -atime +1, a file has to
              have been accessed at least two days ago.

Lo que dice el manual es que, cuando el comando find trata de determinar cuántos períodos de 24 horas han pasado desde la última fecha de acceso, se ignora la parte fraccional. Por lo tanto si hubiesen pasado 36 horas desde el último acceso a un determinado archivo, lo que equivaldría a 1,5 días, find ignora la parte fraccional e interpreta que ha pasado 1 día, 24 horas. Esto implica que para que un archivo coincida con el criterio de búsqueda "que haya sido accedido por última vez hace más de un día", el mismo debe haber sido accedido por última vez hace al menos 2 días, es decir, 48 horas. Para find 36 (1,5 días, truncando la parte fraccional es 1) no es mayor que 24, sino que es igual. En cambio 48 (2 días) sí es mayor que 24 (1 día).

Ahora que entendemos cómo funciona find, quiero buscar los archivos modificados en las últimas 24 horas. Es decir, cuya fecha de modificación es hace menos que 24 horas (lo que significa que su fecha de modificación, en tiempo, es después que hace 24 horas). Por ejemplo los archivos que fueron modificados hace 21 (fecha de modificación menor que tres horas después que la fecha 24 horas atrás), 22 (fecha de modificación menor que dos horas después que la fecha 24 horas atrás) o 23 horas (fecha de modificación menor que una hora después que la fecha 24 horas atrás), pero no los que han sido modificados hace 24 horas o más.

Veamos un ejemplo. Si la fecha actual es 4 de julio a las 13:00 hs, necesito buscar los archivos que fueron modificados entre el 3 de julio a las 13:00 hs y el 4 de julio a las 13:00 hs. Entonces si un determinado archivo tiene la fecha de modificación 3 de julio a las 14:00 hs, significa que fue modificado hace 23 horas, o que su fecha de modificación es una hora después que 24 horas atrás. Si otro archivo en cambio tiene la fecha de modificación 4 de julio a las 11:00 hs, significa que fue modificado hace 2 horas, o que su fecha de modificación es 22 horas después que hace 24 horas.

De esta forma, para buscar los archivos modificados en las últimas 24 horas, debo indicarle a la opción -mtime que deseo sólo los archivos que han sido modificados hace menos que 24 horas atrás. Como el parámetro n de la opción mtime indica los días que han pasado desde la última modificación, debo utilizar -1. De esta forma estoy indicando que obtenga sólo aquellos cuya fecha de modificación es hace menos que hace un día.

find / -type f -mtime -1

Suponiendo que deseo buscar sólo dentro del directorio /etc, el resultado en mi workstation CentOS 6 es el siguiente:

[root@hal9000 ~]# find /etc -type f -mtime -1
/etc/resolv.conf
/etc/mtab
/etc/reader.conf
/etc/adjtime
/etc/vmware/vmnet1/dhcpd/dhcpd.leases
/etc/vmware/vmnet8/dhcpd/dhcpd.leases
/etc/vmware/vmnet8/nat.mac
/etc/vmware/hostd/vmAutoStart.xml
/etc/vmware/config
/etc/vmware/usbarb.rules

Bien, esta salida es muy sintética, y el título del artículo habla de "listar". Ahora que tengo la lista de archivos modificados en las últimas 24 horas, deseo que muestre para cada uno la fecha de modificación exacta. Para ello simplemente debo ejecutar:

[root@hal9000 ~]# find /etc -type f -mtime -1 -exec ls -gGh --full-time '{}' \; | cut -d ' ' -f 4,5,7
2014-07-03 07:31:41.693306383 /etc/resolv.conf
2014-07-03 07:32:01.412090187 /etc/mtab
2014-07-03 07:31:48.750306375 /etc/reader.conf
2014-07-02 14:58:31.498817055 /etc/adjtime
2014-07-03 07:31:45.010306378 /etc/vmware/vmnet1/dhcpd/dhcpd.leases
2014-07-03 07:31:45.194306379 /etc/vmware/vmnet8/dhcpd/dhcpd.leases
2014-07-03 07:31:45.154306378 /etc/vmware/vmnet8/nat.mac
2014-07-03 07:31:59.689165646 /etc/vmware/hostd/vmAutoStart.xml
2014-07-03 07:31:47.724306376 /etc/vmware/config
2014-07-02 14:58:28.407952428 /etc/vmware/usbarb.rules

Para que comprueben que funciona correctamente, la fecha actual es:

[root@hal9000 ~]# date '+%Y-%m-%d %H:%M:%S.%N'
2014-07-03 12:05:19.264248617

El comando anterior parece complicado, pero no lo es. Utilizando la opción -exec, ejecuto el comando ls -gGh --full-time sobre cada archivo encontrado. Para esto, find reemplaza las llaves ('{}') por el nombre de archivo de cada resultado. El punto y coma le indica a find el final del comando a ejecutar sobre cada resultado, el cual debe ser escapado para no ser interpretado por Bash. Finalmente, tomo el resultado de find y se lo paso como entrada a cut para quedarme sólo con las columnas que me interesan (4, 5 y 6, separadas por espacios en blanco).

Si en lugar de listar los archivos quisiera copiarlos a un directorio (por ejemplo para hacer un backup), debería ejecutar:

find /etc -type f -mtime -1 -exec cp '{}' /tmp/modificados/ \;

Conclusión

Volviendo atrás un poco, cuando especificamos el parámetro -1 en la opción -mtime, esto se traduce a <1. Pero recordemos que el comando find descarta la parte fraccional. Habíamos visto por ejemplo que 23 hs representan 0,9583 días, y truncando la parte fraccional representan 0 días. Por lo tanto, para find, <1 es exactamente igual a 0. De esta forma podemos obtener el mismo resultado ejecutando:

[root@hal9000 ~]# find /etc -type f -mtime 0 -exec ls -gGh --full-time '{}' \; | cut -d ' ' -f 4,5,7
2014-07-03 07:31:41.693306383 /etc/resolv.conf
2014-07-03 07:32:01.412090187 /etc/mtab
2014-07-03 07:31:48.750306375 /etc/reader.conf
2014-07-02 14:58:31.498817055 /etc/adjtime
2014-07-03 07:31:45.010306378 /etc/vmware/vmnet1/dhcpd/dhcpd.leases
2014-07-03 07:31:45.194306379 /etc/vmware/vmnet8/dhcpd/dhcpd.leases
2014-07-03 07:31:45.154306378 /etc/vmware/vmnet8/nat.mac
2014-07-03 07:31:59.689165646 /etc/vmware/hostd/vmAutoStart.xml
2014-07-03 07:31:47.724306376 /etc/vmware/config
2014-07-02 14:58:28.407952428 /etc/vmware/usbarb.rules

Entonces, obtener los archivos modificados en las últimas 24 horas, significa obtener los archivos modificados hace 0 días (truncando la parte fraccional).

Espero que sea útil y lo hayan entendido, ya que el trabajo con fechas es tal vez un poco confuso.


Tal vez pueda interesarte


Compartí este artículo