Este artículo demuestra cómo obtener las fechas de acceso, modificación, cambio de estado y creación de un archivo en un sistema GNU/Linux en sistemas de archivos ext4.



En los sistemas operativos de la familia Unix comúnmente se utiliza la herramienta ls para listar archivos y directorios. Más allá de que se puedan encontrar disponibles otros utilitarios como dir. En sistemas GNU/Linux o GNU+Linux es provisto por paquete coreutils (el paquete que le pone la GNU a la expresión GNU/Linux o GNU+Linux).

Cuando se utiliza la opción de listado largo (-l), se muestran por defecto las fechas de modificación de archivos:

emi@hal9000:~$ ls -l /etc/apt/
total 32
drwxr-xr-x 2 root root 4096 Nov 13 08:15 apt.conf.d
drwxr-xr-x 2 root root 4096 May 28  2019 auth.conf.d
-rw-r--r-- 1 root root  150 Nov  7 08:44 listchanges.conf
drwxr-xr-x 2 root root 4096 Nov  7 08:15 preferences.d
-rw-r--r-- 1 root root  764 Nov  8 08:30 sources.list
-rw-r--r-- 1 root root    0 May  2  2019 sources.list~
drwxr-xr-x 2 root root 4096 May  2  2019 sources.list.d
-rw-r--r-- 1 root root 2247 Nov  8 08:31 trusted.gpg
drwxr-xr-x 2 root root 4096 Nov  8 08:31 trusted.gpg.d

Cuando además se agrega la opción -u es posible obtener las fechas de acceso (la última vez que el archivo fue abierto, ya sea para lectura, escritura o modificación):

emi@hal9000:~$ ls -lu /etc/apt/
total 32
drwxr-xr-x 2 root root 4096 Dec 27 07:33 apt.conf.d
drwxr-xr-x 2 root root 4096 Dec 10 07:12 auth.conf.d
-rw-r--r-- 1 root root  150 Dec 10 07:12 listchanges.conf
drwxr-xr-x 2 root root 4096 Dec 27 07:51 preferences.d
-rw-r--r-- 1 root root  764 Dec 27 07:51 sources.list
-rw-r--r-- 1 root root    0 Oct 17 08:58 sources.list~
drwxr-xr-x 2 root root 4096 Dec 27 07:51 sources.list.d
-rw-r--r-- 1 root root 2247 Dec 10 07:12 trusted.gpg
drwxr-xr-x 2 root root 4096 Dec 10 07:12 trusted.gpg.d

Esta es la forma más común para obtener la fecha de acceso a un archivo. Sin embargo, ls (al menos la versión de ls de GNU coreutils) no posee una opción para mostrar la fecha de creación. A tal fin se debe emplear la herramienta stat:

emi@hal9000:~$ stat /etc/apt/sources.list
  File: /etc/apt/sources.list
  Size: 764       	Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d	Inode: 1704419     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-12-27 07:51:59.404784721 -0300
Modify: 2019-11-08 08:30:32.377002905 -0300
Change: 2019-11-08 08:30:32.377002905 -0300
 Birth: -

También provista por el paquete GNU coreutils, permite visualizar el estado de un archivo o sistema de archivos. stat muestra el tamaño, permisos, cantidad de bloques en disco utilizados, tipo de archivo, identificación del dispositivo, número de inodo, cantidad de enlaces, ownership y fechas de acceso ("Access"), modificación ("Modify"), cambio de estado ("Change") y creación ("Birth").

Aunque la fecha de creación es una característica no soportada por cualquier sistema de archivos. Tal como se observa en la salida anterior, el guion del medio en el campo "Birth" significa que el sistema de archivos al que pertenece dicho archivo no soporta el almacenamiento de la fecha de creación, sólo modificación, acceso y cambio de estado (por ejemplo cuando se cambian permisos). Al menos eso pareciera...

Los sistemas de archivos ext4 reservan una cantidad de espacio específica dentro de cada inodo para metadatos extendidos, como la fecha de creación y estampillas de tiempo en nanosegundos, a través de la característica "extra_isize", soportada a partir del kernel Linux 2.6.28.

No obstante ocurre que las herramientas de espacio usuario no son capaces de extraer esta información con propiedad (al menos las versiones menos actualizadas).

Es posible comprobarlo empleando la herramienta de depuración de sistemas de archivos ext2/ext3/ext4 debugfs (parte del paquete e2fsprogs):

root@hal9000:~# debugfs /dev/sda1 -R 'stat /etc/apt/sources.list' | cat
debugfs 1.44.5 (15-Dec-2018)
Inode: 1704419   Type: regular    Mode:  0644   Flags: 0x80000
Generation: 3614152726    Version: 0x00000000:00000001
User:     0   Group:     0   Project:     0   Size: 764
File ACL: 0
Links: 1   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x5dc551d8:59e26e64 -- Fri Nov  8 08:30:32 2019
 atime: 0x5e05e24f:60821944 -- Fri Dec 27 07:51:59 2019
 mtime: 0x5dc551d8:59e26e64 -- Fri Nov  8 08:30:32 2019
crtime: 0x5ccb5be8:11b846ac -- Thu May  2 18:06:48 2019
Size of extra inode fields: 32
Inode checksum: 0xf6f598ba
EXTENTS:
(0):6862097

O, de manera más prolija:

root@hal9000:~# debugfs /dev/sda1 -R 'stat /etc/apt/sources.list' 2>/dev/null | grep crtime
crtime: 0x5ccb5be8:11b846ac -- Thu May  2 18:06:48 2019

Así se logra obtener la fecha de creación de un archivo (en una combinación de sistema de archivos y kernel Linux que lo soporte) aún cuando las herramientas de espacio usuario no sean capaces de obtenerla.

Para mayor información, consultar las siguientes páginas de manual:

man ls
man stat
man ext4
man debugfs


Tal vez pueda interesarte


Compartí este artículo