Introducción
Como muchos ya saben, muchas cosas se manejan en Unix, y en consecuencia en Linux, como si fueran archivos, se abren, se cierran, se escribe en ellos, etc. Este pequeño artículo hace referencia a las marcas de tiempo que ponen los Unix en dichos archivos. Al menos los que estan basados en inodes.
Viendo las marcas de tiempos
Para el principiante el comando ls es su primera opción pero si entra en problemas, como yo lo hice, puede que se frustre con dicho comando. Ejemplo:
root@pianodaemon-laptop:/home/pianodaemon# ls -l proto.sh -rw-r--r-- 1 pianodaemon pianodaemon 4878 2007-11-09 12:44 proto.sh
¿ En este caso qué marca de tiempo estamos viendo ?
Las tres marcas
Unix pone tres marcas de tiempo a un archivo:
- Access
- Modify
- Change
stat el comando
stat es parte del paquete coreutils de GNU. Por favor, instalatelo si esta disponible para tu plataforma, hasta donde se, Linux, AIX, Solaris, y otros sabores de Unix, Esto te va a ahorrar muchos dolores de cabeza.
Cuando se crea por primera vez un archivo, por ejemplo con el comando touch, las tres marcas tienen el mismo valor. Miremos ahora la salida de stat del mismo archivo ejemplo:
root@pianodaemon-laptop:/home/pianodaemon# stat proto.sh File: `proto.sh' Size: 4878 Blocks: 16 IO Block: 4096 archivo regular Device: 801h/2049d Inode: 6685006 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/pianodaemon) Gid: ( 1000/pianodaemon) Access: 2007-11-09 17:27:44.000000000 -0600 Modify: 2007-11-09 17:27:44.000000000 -0600 Change: 2007-11-09 17:27:44.000000000 -0600
¡Esto si es información completa ! Vemos reportado, el nombre, el tamaño, los bloques, el tipo de archivo (regular), información física de donde se encuentra (dispositivo/inode), los permisos estandar, los dueños del archivo y las tres marcas de tiempo Unix.
Opciones interesantes de formato de salida del comando stat:
- %X Time of last access as seconds since Unix Epoch
- %x Time of last access
- %Y Time of last modification as seconds since Unix Epoch
- %y Time of last modification
- %Z Time of last change as seconds since Unix Epoch
- %z Time of last change
Las opciones en mayúscula nos imprimen la marca de tiempo transcurrido desde la Epoca Unix, y las opciones en minúscula imprimen la marca de tiempo legible para el humano.
Ejemplo:
root@pianodaemon-laptop:/home/pianodaemon# stat --format=%X proto.sh 1194650864
root@pianodaemon-laptop:/home/pianodaemon# stat --format=%x proto.sh 2007-11-09 17:27:44.000000000 -0600
Ambos “números” son equivalentes m¡s el primero es un número absoluto, el segundo es interpretado ya que muestra la configuración de la zona horaria (-0600). Mi configuración de hora/fecha es zona America/Mexico y uso UTC.
Marca de Tiempo
Las marcas de tiempo se almacenan en el inode del archivo correspondiente con, hasta donde he confirmado, 32 bits de codificacion. Estos enteros son con signo, los negativos representan fechas en el pasado de la época Unix, y los positivos, fechas futuras desde la época Unix. La época Unix es la hora/fecha 00:00:00 UTC del 1ero de Enero de 1970.
Algunos datos para desarrolladores Python
En lo personal prefiero el desarrollar scripts sobre el interprete Python a bash. Asi que uso stat sobre el mismo:
import os, glob from stat import * for folder in glob.glob( base_path ): for file in glob.glob( folder + '/*.mp3' ): print file # retrieves the stats for the current file # return the last-modified-date last_mod_date = os.stat( file )[ST_MTIME] print last_mod_date
