A veces necesitamos conocer la fecha (año-mes-día) del día de ayer para relizar ciertas tareas en scripts que corren diariamente y de forma automática. Más allá de evitar entrar en cálculos matemáticos en Bash o sh, calcular la fecha del día anterior no es una tarea trivial. ¿Qué pasa si se trata del primero de marzo? ¿Cuál es el día de ayer: 28 o 29 de febrero? Por ello es mejor relegar este tipo de cálculos a las herramientas especializadas como date. La belleza de la modularización o filosofía Unix (do one thing, and do it well) de las herramientas de espacio usuario en sistemas *nix.



Supongamos que cierto script tiene que realizar tareas de mantenimiento sobre archivos o directorios que incluyen la fecha de creación en el nombre (típicamente backups o archivos de log) con un formato predecible (por ejemplo: YYYY_MM_DD).

La herramienta date, por defecto, retorna la fecha en un formato amigable para el usuario:

root@hal9000:~# date
Fri Jun  7 08:40:39 -03 2019

Sin embargo, es posible utilizar cualquier formato personalizado empleando el operador '+':

root@hal9000:~# date +%Y_%m_%d
2019_06_07

La sección "FORMAT" de la página de manual de date describe los diferentes modificadores de formato disponibles (man date).

Como explicaba al comienzo del artículo, obtener la fecha del día anterior no es una tarea trivial. Pues no es tan simple como restar 1 al día. Si es el día 1 habrá que restar 1 al mes. Lo mismo ocurre para el mes de enero. Por otro lado está el asunto de los años bisiestos. No es una tarea que se pueda resolver programáticamente de forma simple y elegante.

Por ello es mejor dejarlo en manos de profesionales. La herramienta date permite retornar la fecha de cualquier día utilizando la opción -d. Si entonces se necesita obtener la fecha del día de ayer, simplemente pasar como parámetro "yesterday":

root@hal9000:~# date -d yesterday
Thu Jun  6 08:41:17 -03 2019

Luego basta con aplicar el formato necesario:

root@hal9000:~# date -d yesterday +%Y_%m_%d
2019_06_06

Desde un script se podría asignar esta salida directamente a una variable para ser utilizado luego:

emi@hal9000:~$ AYER=$(date -d yesterday +%Y_%m_%d)
emi@hal9000:~$ echo $AYER
2019_06_06


Tal vez pueda interesarte


Compartí este artículo