Comparto un script sencillo que permite borrar automáticamente backups viejos en un servidor GNU/Linux.

Uno de los servidores en la nube que administro es un pequeño VPS con sólo 30 GB de espacio en disco. En este servidor se generan copias de seguridad (backups) diariamente, que son enviadas a un servicio en la nube para su almacenamiento persistente (por ejemplo Google Drive, GCS o Dropbox). Sin embargo las copias locales se acumulan hasta ocupar todo el espacio en disco disponible. Otro de mis scripts me avisa por correo electrónico antes de que se llene el disco. Como los backups son pequeños, esto ocurre apenas un par de veces al año, sin embargo hoy me aburrí de entrar a borrar backups viejos e implementé este script.

La idea del script es, dada una lista de directorios y una cantidad de días de antigüedad, buscar y borrar en los directorios de la lista todos los archivos cuya fecha de modificación sea anterior a la antigüedad especificada (x cantidad de días hacia atrás).

#!/bin/bash

# Directorios donde borrar archivos
DIRS="/backup/files/ /backup/databases/"

# Borrar archivos de más de x días
DAYS=60

echo "[$(date '+%Y-%m-%d %H:%M:%S')] inicio borrado de backups"

# Borrar del directorio local los archivos de más de $DAYS días
for D in $DIRS; do
  for F in $(find $D -type f -mtime +$DAYS 2>/dev/null); do
    echo "rm $F"
    rm $F
  done
done

La variable DIRS permite configurar una lista de directorios donde buscar archivos a borrar. Cabe destacar que se deben utilizar rutas completas, sin espacios en los nombres de directorio. La variable DAYS establece la cantidad de días de antigüedad a partir de donde se borra un archivo. Con un valor de 60, se borran todos los archivos cuya antigüedad es superior a (aproximadamente) dos meses.

Tal como acostumbro, el script queda publicado en mi cuenta de GitHub: linuxitux/scripts/backup/delete_old_backups.sh.

Veamos el funcionamiento, actualmente el directorio de backups ocupa unos 16 GB:

root@vps:~# du -hs /backup/
16G     /backup/

Al ejecutar el script, indica los nombres de archivo que está borrando:

root@vps:~# scripts/delete_old_backups.sh
[2018-10-10 11:29:41] inicio borrado de backups
rm /backup/files/varwww_2018-08-06_040001.tar.bzip2
rm /backup/databases/www/www_2018-07-18_024004.tar.bzip2
rm /backup/databases/www/www_2018-07-19_024003.tar.bzip2
rm /backup/databases/www/www_2018-08-09_024004.tar.bzip2
rm /backup/databases/www/www_2018-07-14_024004.tar.bzip2
rm /backup/databases/www/www_2018-08-07_024004.tar.bzip2
rm /backup/databases/www/www_2018-08-03_024003.tar.bzip2
rm /backup/databases/www/www_2018-07-31_024004.tar.bzip2
rm /backup/databases/www/www_2018-08-05_024007.tar.bzip2
rm /backup/databases/www/www_2018-07-20_024004.tar.bzip2
rm /backup/databases/www/www_2018-07-17_024004.tar.bzip2
rm /backup/databases/www/www_2018-07-27_024003.tar.bzip2
rm /backup/databases/www/www_2018-07-24_024004.tar.bzip2
rm /backup/databases/www/www_2018-07-29_024004.tar.bzip2
rm /backup/databases/www/www_2018-07-23_024003.tar.bzip2
rm /backup/databases/www/www_2018-07-30_024004.tar.bzip2
rm /backup/databases/www/www_2018-07-12_024003.tar.bzip2
rm /backup/databases/www/www_2018-07-16_024003.tar.bzip2
rm /backup/databases/www/www_2018-08-06_024004.tar.bzip2
rm /backup/databases/www/www_2018-08-01_024004.tar.bzip2
rm /backup/databases/www/www_2018-07-11_024003.tar.bzip2
rm /backup/databases/www/www_2018-07-13_024003.tar.bzip2
rm /backup/databases/www/www_2018-08-10_024004.tar.bzip2
rm /backup/databases/www/www_2018-07-25_024003.tar.bzip2
rm /backup/databases/www/www_2018-08-02_024004.tar.bzip2
rm /backup/databases/www/www_2018-08-04_024003.tar.bzip2
rm /backup/databases/www/www_2018-08-08_024004.tar.bzip2
rm /backup/databases/www/www_2018-07-26_024003.tar.bzip2
rm /backup/databases/www/www_2018-07-21_024004.tar.bzip2
rm /backup/databases/www/www_2018-07-22_024004.tar.bzip2
rm /backup/databases/www/www_2018-07-28_024004.tar.bzip2
rm /backup/databases/www/www_2018-07-15_024003.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-25_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-15_020005.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-08-05_020007.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-13_020003.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-08-08_020005.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-08-02_020003.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-14_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-31_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-28_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-08-04_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-08-06_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-22_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-16_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-26_020005.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-18_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-08-01_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-23_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-29_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-30_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-21_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-27_020005.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-08-10_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-19_020003.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-08-09_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-08-03_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-12_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-20_020003.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-08-07_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-17_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-24_020004.tar.bzip2
rm /backup/databases/mediawiki/mediawiki_2018-07-11_020004.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-21_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-25_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-30_023002.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-23_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-19_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-27_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-15_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-26_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-22_023002.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-31_023002.tar.bzip2
rm /backup/databases/mysql/mysql_2018-08-05_023002.tar.bzip2
rm /backup/databases/mysql/mysql_2018-08-08_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-12_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-24_023002.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-28_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-18_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-08-07_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-08-02_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-08-01_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-16_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-20_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-14_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-08-10_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-08-09_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-08-04_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-17_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-08-03_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-11_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-29_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-08-06_023001.tar.bzip2
rm /backup/databases/mysql/mysql_2018-07-13_023001.tar.bzip2

Al final la ejecución, se recupera 1 GB (aclaro que había realizado una "limpieza" previa del directorio):

root@vps:~# du -hs /backup/
15G     /backup/

Luego resta configurar una tarea programada para borrar backups viejos 1 vez a la semana (domingos):

root@vps:~/scripts# nano /etc/cron.d/backup

Esta configuración corre el script los días domingo a las 10 de la mañana:

# Delete old backups (weekly)
0 10 * * 1 root /root/scripts/delete_old_backups.sh >> /var/log/backup/delete_old_backups.log 2>&1


Tal vez pueda interesarte


Compartí este artículo