Todo comenzó con el hecho de que me interesé en cómo encontrar los archivos creados o modificados en un sistema en un determinado período de tiempo. Por ejemplo, ¿cómo saber qué archivos de la carpeta /etc
fueron modificados en el último día o en la última semana?
El comando find
hace un excelente trabajo con esta tarea, pero resultó que las siguientes marcas de tiempo están disponibles para cada archivo:
- Acceso
- Modificación
- Cambio
- Creación
Para entender lo que encontramos, es necesario conocer claramente la diferencia entre estas propiedades del archivo.
Este artículo está dedicado a esto, se te dirá:
- cómo ver la hora de modificación del archivo y en qué se diferencia, la hora de modificación de la hora del estado de cambio del archivo
- cómo saber cuándo se abrió el archivo por última vez
- cómo averiguar la hora de creación de un archivo en Linux
- cómo cambiar la hora de acceso, modificación y cambio de estado del archivo
- cómo cambiar la hora de creación de un archivo en Linux y si es posible
- cómo encontrar archivos que han sido modificados o abiertos recientemente
- cómo encontrar archivos que fueron abiertos, editados o creados en un día determinado o hace un tiempo determinado
Todas estas preguntas tienen un significado práctico: desde el simple uso casual – buscar un archivo del que no recordamos el nombre, pero del que recordamos la hora de creación; hasta un uso profesional serio – la aparición de nuevos archivos en el servidor, o modificaciones recientes de archivos importantes, puede indicar un hackeo del sistema o un acceso no autorizado, puede ayudar en la investigación de estos casos a entender los acontecimientos del incidente. O bien ser aplicado con motivos opuestos – qué y cómo debe ser cambiado en las marcas de tiempo para reducir las posibilidades de la investigación forense.
Así pues, ¡comencemos!
Tabla de Contenido
- Las Marcas de Tiempo de los Archivos en el Sistema de Archivos y los Metadatos
- Cómo Ver la Hora en que se Creó, Editó o Abrió un Archivo por Última Vez
- Qué es el Tiempo de Acceso al Archivo, el Tiempo de Modificación del Archivo y el Tiempo de Cambio del Archivo en Linux
- Qué es el Tiempo de Acceso, el Tiempo de Modificación y el Tiempo de Cambio de los Directorios en Linux
- A Qué Hora Muestra el Comando ls -l
- Cómo Buscar y Ordenar Archivos por Tiempo de Modificación, de Acceso y de Cambio de Estado
- Buscar Archivos por Tiempo de Modificación
- Cómo Editar las Marcas de Tiempo de los Archivos
- Cómo Cambiar la Hora de Creación de un Archivo en Linux
- Cómo Cambiar la Hora de Creación y Modificación de un Archivo en Windows
- Conclusión
- Las Marcas de Tiempo de los Archivos en el Sistema de Archivos y los Metadatos
- Cómo Ver la Hora en que se Creó, Editó o Abrió un Archivo por Última Vez
- Qué es el Tiempo de Acceso al Archivo, el Tiempo de Modificación del Archivo y el Tiempo de Cambio del Archivo en Linux
- Qué es el Tiempo de Acceso, el Tiempo de Modificación y el Tiempo de Cambio de los Directorios en Linux
- A Qué Hora Muestra el Comando ls -l
- Cómo Buscar y Ordenar Archivos por Tiempo de Modificación, de Acceso y de Cambio de Estado
- Buscar Archivos por Tiempo de Modificación
- Cómo Editar las Marcas de Tiempo de los Archivos
- Cómo Cambiar la Hora de Creación de un Archivo en Linux
- Cómo Cambiar la Hora de Creación y Modificación de un Archivo en Windows
- Conclusión
Las Marcas de Tiempo de los Archivos en el Sistema de Archivos y los Metadatos
Antes de empezar a hablar de las marcas de tiempo de los archivos, hay que entender que esto forma parte de la funcionalidad del sistema de archivos. En consecuencia, algunas marcas de tiempo pueden no estar disponibles en algunos sistemas de archivos.
Además de las propiedades del archivo en el sistema de archivos, las marcas de tiempo pueden almacenarse en los metadatos del propio archivo. Un gran número de formatos tiene metadatos y, con bastante frecuencia, estos metadatos contienen su propio conjunto de marcas de tiempo, que difieren en su composición e incluso en su valor actual de las marcas de tiempo en el sistema de archivos. Por ejemplo, en el caso de los documentos de Word, además de la fecha de creación, los metadatos también pueden contener marcas de tiempo sobre la fecha de impresión del archivo, el tiempo total de edición del archivo, etc.
En el caso de las imágenes, los metadatos EXIF también pueden contener información independiente del sistema de archivos sobre la hora de creación del archivo.
¡Nunca debes olvidarte de los metadatos si tu objetivo es editar marcas de tiempo! Se utilizan varias aplicaciones para acceder/editar los metadatos -estos temas no se incluyen en este artículo. Este artículo se centra en las marcas de tiempo de los archivos y carpetas que almacena el sistema de archivos.
Cómo Ver la Hora en que se Creó, Editó o Abrió un Archivo por Última Vez
Inmediatamente se pueden ver todas las marcas de tiempo de los archivos utilizando el comando stat
. La ejecución es muy sencilla:
stat NOMBRE_ARCHIVO
Por ejemplo, quiero saber información sobre el archivo miarchivo.txt
:
stat miarchivo.txt
Ejemplo de salida:
Fichero: miarchivo.txt
Tamaño: 19 Bloques: 8 Bloque E/S: 4096 fichero regular
Dispositivo: 803h/2051d Nodo-i: 2367951 Enlaces: 1
Acceso: (0644/-rw-r--r--) Uid: ( 1000/ esgeeks) Gid: ( 1000/ esgeeks)
Acceso: 2021-06-19 19:27:28.360314803 -0500
Modificación: 2021-04-09 19:16:08.909858692 -0500
Cambio: 2021-04-09 19:16:08.909858692 -0500
Creación: 2021-04-09 19:16:08.909858692 -0500
Lo anterior muestra la salida de un comando en el sistema de archivos ext4. Para el sistema de archivos ext2, la fecha de creación del archivo sigue sin estar disponible:
Con la hora de creación (Creación), todo está claro – es cuando se creó el archivo. Por cierto, el programa stat
comenzó a mostrar esta información hace muy poco tiempo. Antes de eso, a la pregunta “¿cómo averiguar la hora de creación del archivo?“, los expertos respondían que el kernel de Linux no lo soportaba (la versión 8.30 de coreutils no lo soporta). Como solución de trabajo, había que mirar el inodo del archivo de interés, y luego usar otro comando para mirar la fecha de cambio de este inodo – esto se consideraba como la hora de creación del archivo.
stat /boot/initramfs-linux.img
Ahora veamos qué significan otras marcas de tiempo en Linux.
Qué es el Tiempo de Acceso al Archivo, el Tiempo de Modificación del Archivo y el Tiempo de Cambio del Archivo en Linux
Marcas de tiempo:
- Acceso (último acceso) – el tiempo en que el archivo fue leído por última vez. Esta hora cambia cuando se utilizan llamadas del sistema como mknod (2), utimes (2) y read (2). Si se trata de un archivo de texto, la fecha de último acceso se actualiza cada vez que se abre. Si se trata de un archivo ejecutable, la fecha de acceso se actualiza cuando se lanza/ejecuta.
Pero, antes de llegar a un uso práctico de la hora del último acceso al archivo (por ejemplo, para comprobar qué comandos se lanzaron en la última hora), hay que tener en cuenta matices muy importantes. Lo anterior muestra que la compatibilidad con determinadas marcas de tiempo depende del sistema de archivos. Además, el comportamiento de las marcas de tiempo depende de las opciones con las que se montó el sistema de archivos. Por ejemplo, al iniciar un script, esperamos que el tiempo de acceso a este archivo cambie al actual. Esto es cierto – para ejecutar el script, éste debe ser leído y el tiempo de acceso debe ser cambiado al tiempo de ejecución. Esto suele ser así. Pero si se accede a un archivo en un sistema de archivos que está montado con las opciones noatime o relatime (u otras posibles opciones que puedan afectar al cambio de atime – por ejemplo, sólo lectura), entonces el comportamiento será diferente.
- noatime: No actualizar el tiempo de acceso al inodo en este sistema de archivos (por ejemplo, para acelerar el rendimiento eliminando operaciones innecesarias)
- relatime: Actualizar el tiempo de acceso al inodo en relación con el tiempo de modificación o cambio de estado. El tiempo de acceso se actualiza sólo si el tiempo de acceso anterior era más antiguo que el tiempo de modificación o cambio de estado, o si el tiempo de acceso anterior es mayor que 1 día.
Así que – ¡el último tiempo de acceso al archivo puede no ser exacto! De hecho, si se utiliza la opción relatime al montar el disco, resulta que muestra:
1) la hora del último cambio de estado o modificación del contenido del archivo
2) la hora de la primera apertura del archivo en el día de hoy
3) A VECES muestra realmente la hora del último acceso al archivo (si el archivo se abrió una sola vez), o si este acceso al archivo se realiza después de su modificación o cambio de estado
- Modificación (última modificación): la hora del último cambio en el contenido del archivo. Es decir, si se trata de un archivo de texto, la hora de modificación cambiará cuando se abra y se borre alguna palabra o se añada algo. Cambiado por las llamadas del sistema mknod (2), utimes (2) y write (2).
- Cambio (último cambio) – La última vez que se modificaron los metadatos del archivo en el sistema de archivos. Es decir, si se cambian los metadatos EXIF en el archivo de imagen, esto será una modificación (ya que el contenido del archivo cambiará esencialmente). Un ejemplo de cambio de estado de un archivo es cambiar los permisos de acceso (lectura, escritura, ejecución), cambiar el propietario, el grupo, etc. Cambiado por chmod (2), chown (2), link (2), mknod.
Qué es el Tiempo de Acceso, el Tiempo de Modificación y el Tiempo de Cambio de los Directorios en Linux
También puedes ver las marcas de tiempo de las carpetas utilizando el comando stat
:
stat /ruta/de/carpeta
Por ejemplo, para ver información sobre el directorio actual:
stat .
Fichero: .
Tamaño: 4096 Bloques: 8 Bloque E/S: 4096 directorio
Dispositivo: 803h/2051d Nodo-i: 2359297 Enlaces: 58
Acceso: (0755/drwxr-xr-x) Uid: ( 1000/ esgeeks) Gid: ( 1000/ esgeeks)
Acceso: 2021-06-19 19:36:44.237008600 -0500
Modificación: 2021-06-19 19:35:45.367005733 -0500
Cambio: 2021-06-19 19:35:45.367005733 -0500
Creación: 2021-03-13 06:57:44.888863953 -0500
En el caso de las carpetas, la última hora de acceso se actualiza al ver la lista de archivos que hay en su interior. Se aplican las mismas reglas que para los archivos – su comportamiento depende de las opciones con las que se monta el sistema de archivos.
Cuando se crea o se elimina un nuevo archivo dentro de un directorio, cuando se modifica el contenido o se cambian las propiedades de un archivo dentro de una carpeta, también se actualizan la hora de cambio y la hora de modificación de esta carpeta.
A Qué Hora Muestra el Comando ls -l
Si ejecutas el comando ls
con la opción -l,
mostrará la última vez que el archivo (o directorio) ha sido modificado. Utilizando la opción --time
, puede mostrar otras marcas de tiempo:
Puedes consultar la página de manual:
man ls
Entonces, encontrarás:
...
--time=WORD
change the default of using modification times; access time
(-u): atime, access, use; change time (-c): ctime, status; birth
time: birth, creation;
with -l, WORD determines which time to show; with --sort=time,
sort by WORD (newest first)
---
Como puedes ver, usando ls
es imposible mostrar la hora de creación del archivo ya que esta característica fue añadida recientemente al kernel.
Si añades la opción --sort=time
, entonces también se ordenará por la marca de tiempo seleccionada.
Hay varias opciones abreviadas:
-c with -lt: sort by, and show, ctime (time of last
modification of file status information);
with -l: show ctime and sort by name;
otherwise: sort by ctime, newest first
-t sort by modification time, newest first
-u with -lt: sort by, and show, access time;
with -l: show access time and sort by name;
otherwise: sort by access time, newest first
Puedes seleccionar el formato de la hora:
--time-style=TIME_STYLE
time/date format with -l; see TIME_STYLE below
El argumento TIME_STYLE
puede ser full-iso, long-iso, iso, locale o +FORMAT. FORMAT se interpreta como en date(1). Si FORMAT es FORMAT1<newline>FORMAT2, entonces FORMAT1 se aplica a los archivos no recientes y FORMAT2 a los archivos recientes. TIME_STYLE prefijado con ‘posix-‘ sólo tiene efecto fuera de la configuración regional POSIX. También la variable de entorno TIME_STYLE establece el estilo por defecto a utilizar.
Hay una reducción de la opción popular:
--full-time like -l --time-style=full-iso
Cómo Buscar y Ordenar Archivos por Tiempo de Modificación, de Acceso y de Cambio de Estado
Ahora llegamos al increíble comando find
. Con su ayuda, mostraremos los archivos necesarios por la fecha de modificación, así como buscaremos los archivos que han sido abiertos o cuyo estado fue cambiado hace un tiempo determinado.
Con el comando find
se puede configurar una búsqueda muy flexible.
Supongamos que quiero ver los archivos de la carpeta /etc
ordenados por fecha de modificación:
find /etc -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r
De forma similar, pero los archivos se ordenan por fecha de acceso:
find /etc -type f -printf '%AY-%Am-%Ad %AT %p\n' | sort -r
Y de nuevo un ejemplo similar, pero los archivos están ordenados por cambio de estado de tiempo:
find /etc -type f -printf '%CY-%Cm-%Cd %CT %p\n' | sort -r
En el comando find, puede personalizar el formato de la fecha según tus necesidades, así como especificar cualquier filtro que admita. Por ejemplo, a continuación se muestra el comando para mostrar los archivos ordenados por fecha de modificación, pero sólo para aquellos con la cadena ‘ssh‘ en el nombre:
find /etc -type f -name '*ssh*' -printf '%TY-%Tm-%Td %TT %p\n' | sort -r
O sólo los archivos con la extensión .desktop:
find /etc -type f -name '*.desktop' -printf '%TY-%Tm-%Td %TT %p\n' | sort -r
O cualquier archivo ordenado por fecha de acceso, pero sólo los 20 primeros:
find /etc -type f -printf '%AY-%Am-%Ad %AT %p\n' | sort -r | head -n 20
Buscar Archivos por Tiempo de Modificación
Para ello, utilizaremos de nuevo el comando find
. Para buscar por tiempo, tiene las siguientes opciones:
-amin n
: El archivo fue accedido por última vez hace n minutos.-atime n
: El archivo fue accedido por última vez hace n*24 horas. Cuando find calcula cuántos periodos de 24 horas hace que se accedió por última vez al archivo, se ignora cualquier parte fraccionaria, por lo que para que coincida con-atime +1
, un archivo tiene que haber sido accedido al menos hace dos días.-cmin n
: El estado del archivo se modificó por última vez hace n minutos.-ctime n:
El estado del archivo se modificó por última vez hace n*24 horas. Consulta los comentarios de -atime para entender cómo el redondeo afecta a la interpretación de los tiempos de cambio de estado de los archivos.-mmin n
: Los datos del archivo fueron modificados por última vez hace n minutos.-mtime n
: Los datos del archivo fueron modificados por última vez hace n*24 horas. Consulta los comentarios de -atime para entender cómo el redondeo afecta a la interpretación de los tiempos de modificación de los archivos.
Es decir, si en la opción aparece la palabra min – entonces el número n se trata como minutos, y si la opción contiene la palabra time, entonces n se trata como un día.
El número n se puede especificar como valor exacto, así como la expresión ‘mayor que n‘ y ‘menor que n‘ de las siguientes maneras:
+n mayor que n,
-n menor que n,
n exactamente n.
Con find
, puedes construir condiciones muy complejas para encontrar exactamente lo que necesitas. Más adelante, se mostrarán algunos ejemplos – pero el número de posibilidades es ilimitado. Con la opción -name
, puedes especificar una plantilla de nombre, puedes combinarla con una búsqueda de cualquier otra propiedad del archivo: tamaño, permisos, etc.
Para encontrar todos los archivos cuyo contenido se modificó hace exactamente 50 días:
find / -mtime 50
Para encontrar todos los archivos a los que se accedió hace exactamente 50 días:
find / -atime 50
Para encontrar todos los archivos cuyo contenido fue modificado hace más de 50 días y menos de 100 días:
find / -mtime +50 -mtime -100
Para encontrar archivos cuyo estado ha sido modificado en la última hora:
find / -cmin -60
Para encontrar archivos cuyo contenido ha sido modificado en la última hora:
find / -mmin -60
Para encontrar todos los archivos a los que se ha accedido en la última hora:
find / -amin -60
Para encontrar todos los archivos en la carpeta actual con la extensión .php
que han sido modificados o creados en los últimos 15 días:
find . -name '*.php' -mtime -15
Para encontrar todos los archivos ejecutables en la carpeta actual que han sido modificados o creados en los últimos 7 días:
find . -type f -perm /a=x -mtime -7
Cómo Editar las Marcas de Tiempo de los Archivos
Utilizando el comando touch
, puedes cambiar las tres marcas de tiempo de un archivo o carpeta:
- hora de acceso
- hora de modificación
- tiempo de cambio de estado
Si deseas cambiar todos estos valores a la hora actual, sólo tienes que ejecutar un comando como el siguiente:
touch ARCHIVO
Puede cambiar por separado sólo el tiempo de acceso o sólo el tiempo de modificación con las opciones:
-a change only the access time
-m change only the modification time
Con la opción -t
se puede establecer cualquier hora para la que queramos cambiar las marcas de tiempo de los archivos. El formato de tiempo es el siguiente:
[[CC]YY]MMDDhhmm[.ss]
En esta línea, lo que está entre llaves es opcional. El significado de las letras es el siguiente:
CC
– Los dos primeros dígitos del año (de la palabra Century)YY
– Los dos segundos dígitos del año.MM
– Mes del año (01-12)DD
– Día del mes (01-31)hh
– Horas del día (00-23)mm
– Minutos de la hora (00-59)ss
– Segundos (00-59)
Ejemplo:
touch -t '205002150303.23' miarchivo.txt
Usando la opción -t
, es imposible especificar una fracción de segundo y en la salida del comando stat
en su lugar estará siempre 000000000
Usando la opción -d
, puedes usar diferentes formas más humanas de especificar un tiempo, por ejemplo, “hace dos semanas“. Esto debería funcionar en inglés, no sé cómo con los idiomas nacionales. La opción -d
(a juzgar por la descripción) entiende diferentes variantes de sintaxis, pero para mí la característica más interesante es la posibilidad de establecer fracciones de segundo para que las marcas de tiempo parezcan naturales, ya que las marcas de tiempo con nueve ceros al final sugieren que son falsas.
Ejemplo de configuración de la hora con fracciones de segundo:
touch -d '2050-02-15 03:15:34.123456789' miarchivo.txt
stat miarchivo.txt
Fichero: miarchivo.txt
Tamaño: 19 Bloques: 8 Bloque E/S: 4096 fichero regular
Dispositivo: 803h/2051d Nodo-i: 2367951 Enlaces: 1
Acceso: (0644/-rw-r--r--) Uid: ( 1000/ esgeeks) Gid: ( 1000/ esgeeks)
Acceso: 2050-02-15 03:15:34.123456789 -0500
Modificación: 2050-02-15 03:15:34.123456789 -0500
Cambio: 2021-06-19 20:42:52.777200814 -0500
Creación: 2021-04-09 19:16:08.909858692 -0500
Es decir, el formato de la línea es tal (puedes omitir los guiones y los dos puntos de la misma – la opción -d
lo seguirá entendiendo, pero los he añadido para mayor claridad):
YYYY-MM-DD HH:MM:SS.mmmmmmmmm
Cómo Cambiar la Hora de Creación de un Archivo en Linux
Aunque el sistema de archivos ext4 soporta una propiedad de archivo como “tiempo de creación“, la capacidad de leer esta propiedad fue añadida recientemente al kernel de Linux. En cuanto a la posibilidad de cambiar el tiempo de creación del archivo, no existe tal función (y no es un hecho que los sistemas de archivos lo soporten en absoluto).
Pero, como siempre, hay algunas ideas.
Volver al futuro
Al copiar un archivo a otro, la hora actual se convierte en su hora de creación. Si cambias la hora del sistema a la que quieres establecer para el archivo como hora de creación, y luego copias el contenido del archivo a uno nuevo, de esta manera puedes establecer cualquier hora de creación para el nuevo archivo.
Cambiar la hora de creación en otros SO o sistemas de archivos
En Internet, hay instrucciones para cambiar el tiempo de creación del archivo en los sistemas operativos que lo soportan. También se propone el uso de algunos otros sistemas de archivos – por ejemplo, la red, en la que también se puede cambiar esta propiedad.
De hecho, en Windows, se puede cambiar no sólo el tiempo de modificación del archivo, sino también el tiempo de creación. Pero el problema es que al migrar a Linux, sólo se guarda el tiempo de modificación. La hora actual se registra como la hora de creación (es decir, la hora de creación del inodo en el sistema de archivos). Y si se entiende esto – que la hora de creación de un archivo es la hora de modificación del inodo, entonces queda claro que es imposible transferir el archivo de ninguna manera (ni en el archivo, ni de ninguna otra manera) conservando la hora de creación.
También queda claro que desde Windows es imposible cambiar la hora de creación de un archivo que está en una carpeta compartida en el sistema de archivos ext4 (aunque lo he intentado por si acaso).
Es decir, sólo hay dos opciones para cambiar la fecha de creación del archivo en Linux: 1) cambiar la hora del sistema; 2) edición de bajo nivel del sistema de archivos (por ejemplo, con un editor hexadecimal o herramientas especiales (si existen)) – con los correspondientes riesgos de romper todo en el sistema de archivos.
Es decir, la mala noticia es que cambiar el tiempo de creación del archivo es muy difícil o casi imposible. Pero la buena noticia es que el tiempo de creación de archivos casi nunca se utiliza en la práctica debido a que no todos los sistemas de archivos lo soportan, y este soporte ha aparecido recientemente en el propio Linux. Por ejemplo, el comando find
no sabe nada sobre la hora de creación del archivo (aunque puede buscar por otras tres marcas de tiempo: modificación, acceso, cambio de estado), el comando ls
tampoco sabe mostrar la hora de creación de un archivo (sólo las tres marcas de tiempo habituales).
Por lo general, se utiliza la hora de modificación del archivo, que puede ser falsificada muy fácilmente mediante el comando touch
.
Cómo Cambiar la Hora de Creación y Modificación de un Archivo en Windows
Por cierto, si te preguntas cómo cambiar el tiempo de creación de archivos en Windows, esto se puede hacer usando la utilidad NirCmd: (modificar tiempo de creación y tiempo de modificación))
nircmd.exe setfiletime "c:\temp\Miarchivo.txt" "24-06-1996 15:55:11" "15-12-2050 12:21:56"
O usando PowerShell (ejemplos por referencia): superuser.com
He comprobado el comando nircmd.exe
– ha funcionado perfectamente en el último Windows 10.
Conclusión
El viaje al mundo de las marcas de tiempo de los archivos en Linux resultó ser mucho más largo de lo que esperaba. Pero, hemos aprendido sobre cuatro marcas de tiempo diferentes, cómo verlas y cambiarlas, y también cómo buscar archivos por cualquiera de las tres marcas de tiempo.
Ya he hablado de esto, pero déjame recordarte una vez más – cuando edites las marcas de tiempo de los archivos, no debes olvidarte de las correspondientes marcas de tiempo en los metadatos del propio archivo (no en los metadatos del sistema de archivos).