Borrar archivos que tienen dos dias de antiguedad

0
900
Hay ocaciones que tenemos que hacer una depuración de nuestro sistema y aun mas si es un backup o simplemente la eliminacion de archivos que tengan ya dos dias de antiguedad.

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

LEAVE A REPLY

Please enter your comment!
Please enter your name here