jueves, 5 de agosto de 2010

Cambiando fechas en ficheros

Este artículo va de algo que tuve que resolver hoy... Tenemos un proceso que genera archivos con fecha, del tipo: archivo_YYYYMMDD.gz. El problema: estos archivos debían tener la fecha del día anterior.

Me explico mejor, el siguiente archivo: mi_archivo_20100805.gz, debía llamarse en realidad: mi_archivo_20100804.gz, como pueden ver debía restar 1 al día que era impreso como fecha y cambiar el nombre de cada archivo.

Inicialmente ataqué el problema con AWK, pero me di por vencido cuando me enfrenté a los archivos con día 01, no podía colocar día 00, debía ser el último día del mes anterior y con esto, otro de los más grandes problemas... Qué mes? año bisiesto? etc, etc...

Entonces, obviamente necesitaba de algún lenguaje de programación que me permitiera hacer operaciones aritméticas con fechas, por ejemplo: PHP.

Aquí les dejo el script que creé, espero sea de utilidad para alguien:

# file: replace_name_-1day.sh
#!/bin/bash

if [ $# -lt 3 ] # validating parameters
then
  echo "Usage: replace_name_-1day.sh prefix date dir"
  echo "date - must be in Y-m-d format"
  exit
fi

prefix=$1
date=$2
dir=$3

fDate=`echo '<?php 
  $date = "'$date'";
  $dateTime = new DateTime($date);
  echo $dateTime->format("Ymd");
?>' | php` # file actual date

fNewDate=`echo '<?php 
  $date = "'$date' - 1 day";
  $dateTime = new DateTime($date);
  echo $dateTime->format("Ymd");
?>' | php` # file new date

mv $dir/$prefix\_$fDate.xml.gz $dir/$prefix\_$fNewDate.xml.gz

Para correr esto pueden seguir el siguiente ejemplo:
$ date=`date +%Y-%m-%d` # sets today's date in format YYYYMMDD
$ dateFile=`date +%Y%m%d` # sets today's date in format YYYY-MM-DD
$ touch mio_$dateFile.gz # generates an empy file with the specified name
$ ./replace_name_-1day.sh mio $date dir 

Se preguntarán por qué manejar la fecha con diferentes formatos (20100805 ó 2010-08-05), pues resulta que es un parámetro que necesita otro programa que no está en este artículo...



No hay comentarios:

Publicar un comentario