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