nov 16 2012

Timestamp to datetime in bash

tatai

Nerver forget again. For timestamp 1353101513:

$ date -d "1970-01-01 + 1353101513 seconds" +"%F %T"
2012-11-16 21:31:53

Et voilà!


ene 3 2010

Trabajar con ficheros a partir de una fecha y hora

tatai

Al hilo del post de ayer sobre date, hace poco tuve que realizar un sencillo script que borrase todos aquellos ficheros más viejos que una determinada fecha (en particular, ayer a las 6.30h).

Seguramente habrás pensado que la mejor opción es un find con -atime (o -mtime o -amin o -cmin, etc) y posteriormente con un -exec. Bien, es una buena idea aunque yo quería que fuese a partir de un determinado momento exactamente, sin calcular. Para esto, también usé find, pero me apoyé en date y en touch y quedó algo así:

#!/bin/bash
# La fecha y hora de ayer a las 6.30h
FECHA=$( date +-d "06:30 yesterday" +"%Y/%m/%d %H:%M:%S" )
# Fichero temporal
POINT=$( tempfile -p "point" )
# Cambiamos la fecha del fichero temporal
touch -d "${FECHA}" ${POINT}
# Buscamos ficheros más viejos que ${POINT} y los borramos
find /path/al/destino -not -newer ${POINT} -exec rm {} \;
# Borramos basura
rm ${POINT}

Es posible que sea algo más lioso, pero sin tener que calcular nada (por ejemplo la diferencia de tiempo entre cuando ejecutemos el fichero y nuestra hora objetivo), hacemos el trabajo rápidamente. Y también podemos cambiar la hora de una forma muy cómoda.

Más info

Este “más info” va a ser un claro RTFM ;)

  • man find
  • man date
  • man touch

ene 2 2010

Ir a una fecha mediante texto

tatai

Seguramente os habrá pasado alguna vez que os interesa cierta fecha, digamos por ejemplo “ahora mismo pero hace 3 días” y queréis usarlo en un comando de consola. Pues bien, esto es realmente sencillo gracias a date.

Antes de entrar en detalle, un par de comentarios sobre el comando date. Lo primero es que si escribimos directamente date tendremos algo parecido a esto:
$> date
Sat Jan  2 22:47:41 CET 2010

Ahora bien, si queremos que muestre la fecha y hora en formato numérico (con guiones y dos puntos), tenemos:

$> date +"%Y-%m-%d %H:%M:%S"
2010-01-02 22:50:06

La otra opción interesante, que es la central de este post, es la opción -d. Con esta opción podemos definir el momento que queremos que date muestre y que sea distinto de ‘ahora’. Lo que seguramente no sabías es que se puede definir este momento en “modo texto” (en inglés, claro está).

Por ejemplo, si queremos la hora actual, pero hace tres días usaremos:

$> date -d "3 days ago"
Wed Dec 30 22:54:44 CET 2009

¿Y si queremos las 6.30h de la mañana de hace 5 días? Fácil:

$> date -d "06:00:00 3 days ago"
Wed Dec 30 06:00:00 CET 2009

Venga, juguemos un poco más!

¿Qué día de la semana fue hace 1 año, 2 meses y 23 días?

$> date +%a -d "1 year ago 2 months ago 23 days ago"
Fri

¿Es el mismo que hace 449 días?

$> date -d "449 days ago"
Fri

Pues sí xDD

¿Las 7.30h de la mañana del pasado lunes?

$> date -d "07:30:00 last monday"
Mon Dec 28 07:30:00 CET 2009

También funciona para fechas futuras.Las 8.00h de la mañana de dentro de dos lunes (cuando se acaban las vacaciones :p):

$> date -d "08:00:00 2 monday"
Mon Jan 11 08:00:00 CET 2010

¿Qué día de la semana será hoy el año que viene?

$> date +%a -d "year 2011"
Sun

En fin, ahora es sólo cuestión de echarle imaginación y tirar de manual y de timespec. ¡Ánimo y suerte!