comando_stat_access_modify_change

This is an old revision of the document!


Entendiendo los timestamps de ficheros en Linux (Acceso / Modificación / Cambio / Creación)

Entender las diferentes marcas de tiempo de los ficheros en Linux es algo básico para su administración, ya que son usados por infinidad de comandos para poder filtrar y encontrar determinados archivos y carpetas.

stat fichero.pdf
  File: `fichero.pdf'
  Size: 921599          Blocks: 1800       IO Block: 4096   regular file
Device: 91a1h/37281d    Inode: 2728917     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2009-04-03 21:40:42.767849143 +0200
Modify: 2009-04-03 21:40:14.665837796 +0200
Change: 2009-05-15 16:41:42.727736900 +0200
 Birth: -

Access / Acceso (atime): Fecha del ultimo acceso, el cual puede ser realizado por las llamadas al sistema mknod(2), utimes(2) / utimensat(2) y read(2). Algunas distribuciones desactivan la actualización de esta información para evitar operaciones de entrada y salida (fstab: noatime,nodiratime,etc)

Modify / Modificación (mtime): Fecha de la última modificación, que pudo ser ocasionada por las llamadas sl sistema mknod(2), utimes(2) / utimensat(2) y write(2). Comandos como “stat” “ls -l” o “date -r” muestran la fecha de modificación de un fichero.

Change / Cambio (ctime): Fecha de la ultima modificación del inodo (metadatos), ocasionado por las llamada al sistema chmod(2), chown(2), link(2), mknod(2), rename(2), unlink(2), utimes(2) / utimensat(2) y write(2).

Birth / Creación (crtime): La fecha de creación de un fichero antiguamente no se podía visualizar con el comando stat (Birth: - (leer)), pero actualmente dependiendo de la versión del sistema sí es factible. Si se está usando un sistema antiguo puede utilizarse debugfs para obtener dicha fecha de creación, veamos un ejemplo usando LVM.

debugfs -R 'stat /home/maria/fichero' /dev/mapper/Volgroup00-lv_root
debugfs 0.92.13 (15-May-2008)
Inode: 269835   Type: regular    Mode:  0644   Flags: 0x80000
Generation: 2264140096    Version: 0x00000000:00000001
User:     0   Group:     0   Size: 0
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 0
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x57225282:ad2d99c0 -- Thu Apr 28 20:12:18 2009
 atime: 0x57225195:32e9e720 -- Thu Apr 28 20:08:21 2009
 mtime: 0x57225282:ad2d99c0 -- Thu Apr 28 20:12:18 2009
crtime: 0x57225195:32e9e720 -- Thu Apr 28 10:01:21 2008
Size of extra inode fields: 32
EXTENTS:

Usando el inodo del fichero / directorio en vez de la ruta al fichero (Versiones antiguas de debugfs).

ls -i /home/maria/fichero 
267850 /home/maria/fichero
 
debugfs -R 'stat <267850>' /dev/mapper/Volgroup00-lv_root

NOTA: Los timestamps de creación y cambio en Linux no pueden ser modificados a fecha de hoy.

Uso del comando ls para ordenar y visualizar las fechas de acceso, modificación y cambios de ficheros / directorios.

ls -ltu  # Visualiza y ordena por la fecha del último acceso (atime).
ls -lt   # Visualiza y ordena por fecha de la ultima modificación (mtime).
lt -ltc  # Visualiza y ordena por fecha del último cambio (ctime).
# NOTA: Sin la "t", usando solo la opción "l", siempre se ordena por nombre. (-h es recomendable para leer el mejor el tamaño de los archivos con ls)

Modificar las fechas de acceso / modificación de un fichero con touch (man touch).

 # Modifica los estados de acceso (-a), modificación (-m) por la fecha actual.
touch fichero
# NOTA: Se puede utilizar indistintamente -a, --time=atime, --time=access, --time=use
 
# Copiar las marcas de tiempo de otro fichero.
# NOTA: Los timestamps de "creación" y "cambio" no pueden ser modificados a fecha de este artículo en sistemas GNU/Linux. Mirar el hack del siguiente apartado.
# NOTA: Esta acción realiza un cambio en el timestamp de change del fichero origen.
touch fichero -r otro_fichero.txt # Se puede utilizar -a y -m si solo interesa copiar "atime" o "mtime".
 
# Si el archivo llamado "fichero" existe, actualiza los timestamp que tenga, en caso contrario no crea el fichero.
touch -c fichero
 
# Especificar una fecha en concreto (-t / -d).
touch -t 201408121510.59 fichero        # 12-08-2014 a las 15:10:59
touch -d 11am fichero                   # 11 de la mañana de hoy.
touch -d "last fortnight" fichero       # 15 días atrás.
touch -d "yesterday 6am" fichero        # Ayer a las 6 de la mañana.
touch -d "380 days ago 12:00" fichero   # Hace 380 días a las 12:00.
touch -d "tomorrow 02:00" fichero       # Ayer a las 02:00.
touch -d "5 Nov" fichero                # 5 de Noviembre de este año.

NOTA: El timestamp de “Change” (Cambio) es modificado a la vez que se cambia la fecha de último acceso o de la última modificación.

Hack para falsear de manera aproximada la fecha de creación/change de un fichero

# Fechas del fichero anaconda-ks.cfg.
stat anaconda-ks.cfg 
  File: 'anaconda-ks.cfg'
  Size: 963       	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 16777679    Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-08-30 08:23:20.596083465 +0200
Modify: 2020-08-30 08:23:20.596083465 +0200
Change: 2020-08-30 08:23:20.597166885 +0200
 Birth: -
 
# Indicamos al sistema que debe irse a la fecha de creación del fichero anaconda-ks y copiamos el fichero en ese mismo momento.
date --set="2020-08-30 08:23:20.597166885"; cp anaconda-ks.cfg anaconda-ks.cfg_hack
# Se clonan los titmestamps de acceso y modificación (lo cual obliga a cambiar de nuevo el timestamp de cambio).
touch anaconda-ks.cfg -r anaconda-ks.cfg_hack
# Por último volvemos el sistema a la hora actual, en este caso por medio de chronyc, pero eso uede variar del sistema en uso.
chronyc -a makestep
 
# Comparemos los dos ficheros.
stat anaconda-ks.cfg*
  File: 'anaconda-ks.cfg'
  Size: 963       	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 16777679    Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-08-30 08:23:20.597166885 +0200
Modify: 2020-08-30 08:23:20.597166885 +0200
Change: 2020-08-30 08:23:20.598250304 +0200
 Birth: -
 
  File: 'anaconda-ks.cfg_hack'
  Size: 963       	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 18947745    Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-08-30 08:23:20.597166885 +0200
Modify: 2020-08-30 08:23:20.597166885 +0200
Change: 2020-08-30 08:23:20.597166885 +0200
 Birth: -
comando_stat_access_modify_change.1659907153.txt.gz · Last modified: 2022/08/07 23:19 by busindre