Espacio de tecnologia, software libre y sus derivados. Una horda de monos entrenados escriben de vez en cuando por aqui algunas noticias, opiniones e incluso alguna que otra cosa fuera del tema. Maqueros, favor de abstenerse que no somos lo suficientemente guapos.

Piano daemon

Marcas de Tiempo en Archivos Unix

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

Comenta