Backup incremental entre google Drive


El objetivo de este script es el de hacer un backup de una carpeta de google Drive a otra carpeta de Google drive de Backup. 

La idea es trabajar con Google Drive y mantener un backup (tb en google drive por la cantidad de datos) de manera que los backups sean incrementales y pueda recuperar versiones anteriores de archivos de forma fácil.

Si uso windows y "mapeo" la unidad de google al ordenador, un potencial virus podria cifrar el contenido de la carpeta de google, por lo que requiero de un backup donde mi ordenador no tenga acceso.

Con rclone se pueden sincronizar carpetas y además almacenar los cambios en subcarpetas, asi que perfecto:


#!/bin/bash
#########################################
# Script de backups
#########################################

########################
# COLORS
########################
green="\e[42m"
blue="\e[1;34m"
red="\e[31m"
bold="\e[1m"
end="\e[0m"

########################
# Google Drive
########################

GD_Control_Versiones() {
	local remote="$1"
	local num_versions=30
	local versions=( $(rclone lsd $remote | cut -d '-' -f 5 | cut -d ' ' -f 2 | grep -e '^20' | sort -r | xargs) )
	local versions_to_remove=( ${versions[@]:$num_versions:100} )

	echo -e "\tControl de versiones de $remote"
	echo -e "\t\tVersiones encontradas: ${versions[@]}"
	echo -e "\t\tVersiones a eliminar: ${versions_to_remove[@]}"

	for v in ${versions_to_remove[@]}; do
		echo -e "\t\tEliminando $v"
		rclone purge $remote/$v
	done
}

Help() {
	# mostrar la ayuda
	echo "Script para sincronizar incrementalmente carpetas de google drive"
	echo "configuradas en rclone."
	echo 
	echo "Parametros requeridos:"
	echo -e "-h \t Ayuda"
	echo -e "-o \t Origen (remote de rclone)"
	echo -e "-d \t Destino (remote de rclone)"
	echo -e "-r \t Listar unidades remotas de rclone"
	echo
}

#fecha actual para mantener la versiona anterior de los ficheros modificados hoy
fecha_actual=$(date +%Y%m%d)

# Recogida de parametros
while getopts "hro:d:" option; do
	case $option in
		h) Help ; exit 0 ;;
		r) echo "Listando unidades remotas:"; echo; rclone listremotes; exit 0;;
		o) ORIGEN=$OPTARG ;;
		d) DESTINO=$OPTARG ;;
		\?) exit -1 ;;
		:)  exit -1 ;;
	esac
done

if [ -z $ORIGEN ] || [ -z $DESTINO ]; then
	echo -e "${bold}${red}ERROR: no se ha definido el origen o destino.${end}"
	echo 
	Help
	exit -1
fi

# Copia de origen a destino y control de versiones (borrado de modificaciones viejas)
TMP=$(mktemp)
echo -e "[+] $fecha_actual [+] Copiando Google Drive: $ORIGEN a $DESTINO"
rclone -v --drive-server-side-across-configs sync $ORIGEN $DESTINO/current --backup-dir $DESTINO/$fecha_actual 2> $TMP && cat $TMP | paste /dev/null - && rm -f $TMP
GD_Control_Versiones $DESTINO

Comentarios