Para ello se requiere de un cron que genera diarmente un respaldo de archivos de la base de datos, solo que el directorio donde se hacen es limitado, por lo tanto es necesario antes de generar el nuevo respaldo, borrar el de 2 dias antes, pero hay que dejar el del dia pasado.
De este respaldo se generan varios archivos, los cuales en el nombre del archivo contienen la fecha de creacion con un formato de AAAAMMDDnombre.bak .
por lo tanto en este momento existen en el directorio los siguientes archivos:
20070723archivo1.bak
20070723archivo2.bak
20070724archivo1.bak
20070724archivo1.bak
y hoy se generarán los archivos
20070725archivo1.bak
20070725archivo1.bak
mi primera idea fue hacer un simple
find . -mtime 2 -exec rm -rf {} \;
ok desmenusando
find, comando basico de busqueda en el entorno unix
el “.” es para decirle que busque de este directorio y sus subdirectorios correspoendientes.
-mtime “fecha de modificacion”
2 (exactamente 2 dias), si usamos -2 seria que tuvieran 2 o menos dias de modificados y si usamos +2 serían los archivos que tuvieran 2 o mas dias de modificados.
-exec ejecutar un comando
rm -rf borrar el archivo . Cuando usamos la clausual -exec tenemos que poner {} \;
Bueno pues hasta ahi parecía que todo funcionaba solo que como el cron corre a la media noche la fecha (12:00) y el archivo se termina de crear a las 12:05, al ejecutar el comando no me borra los archivos del dia 23 porque a las 12:00 los archivos no han cumplido exactamente los 2 dias de modificados, explicandolo mejor
archivo fecha y hora de creacion
20070723archivo1.bak 23 Julio 2007 12:05 AM
20070723archivo2.bak 23 Julio 2007 12:10 AM
20070724archivo1.bak 24Julio 2007 12:05 AM
20070724archivo1.bak 24Julio 2007 12:10 AM
asi que a las 12:00 del dia 25 los archivos del dia 23 aun no cumplen los 2 dias, entonces la línea que necesito sería:
find . -name ‘*20070723*’ -exec rm -rf {} \;
correcto? pero como hago que esto sea dinamico pues con un script asi:
#!/bin/ksh
echo “find . -name ‘*\c” > borra.sh
date ‘+%y:%m:%d’ | awk -F”:” ‘{printf”20%2d%2d%2d\n”,$1,$2,($3-2)}’ | sed ’s/ /0/g’ | tr -d ‘\n’ >> borra.sh
echo “*’ -exec rm -rf {} \;” >> borra.sh
chmod u+x borra.sh
./borra.sh
y que hace??
la primera línea escribe en el archivo borra.sh lo siguiente “find . -name ‘*”, el \c es para que no de el salto de línea (como se puede ser este script es para el ksh, con el bash puedes poner echo -n y no tendrias que poner el \c)
la segunda línea saca la fecha de hoy y al formatearla le resta los 2 dias ($3-2) de acuerdo a lo que necesito AAAAMMDD, el tr -d es tambien para evitar el salto de línea, y lo agrega al archivo borra.sh
la tercer línea completa el find con “*’” , el exec y el rm lo explique arriba, y tambien lo agrega al archivo borra.sh
se le dan permisos de ejecution al archivo borra.sh
y finalmente se ejecuta.
si le dieramos un more o un cat al archivo borra.sh contendría:
find . -name ‘*20070723*’ -exec rm -rf {} \;
con esto el día de hoy se borrarían los archivos del dia 23, sin importar la hora en la que fueron creados.
No es la única forma de hacerlo es la que a mi se me ocurrió
referencias útiles:
dale un man al find jeje
y estas dos ligas
http://csdir.org/tutorials/bash-tutorial/
http://www.wagoneers.com/UNIX/FIND/find-usage.html