Script para hacer copias de seguridad incrementales

Actualizado : lunes, 09 de febrero de 2009
Hoy público en script que tenía hace tiempo funcionando pero muy mal estructurado, hoy he estado puliendolo y creo que esta suficientemente presentable como para publicarlo. Esta basado en bash (no es necesario python para nada) y la idea es poder hacer copias incrementales de la forma más fácil posible. (sin parametros o pocos parametros con buenos valores por defecto).

El script se puede ejecutar con 0, 1 o 2 parametros:

  • 0 parametros : si simplemente ejecutamos el script, sin parametros, considerará que quieres hacer una copia de seguridad del directorio de trabajo actual. Si el directorio activo es por ejemplo: /home/makiolo/descargas se creara el directorio copia_de_descargas con la copia principal y las copias incrementales.
  • 1 parametros : si no queremos especificar el directorio que queremos salvar de forma implicita (por directorio de trabajo), sencillamente pasamos la ruta del directorio que queremos salvar(absoluta o relativa) como primer parametro. Se creara en el mismo directorio que queremos salvar la carpeta copia_de_$nombre con la copia principal y las copias incrementales. Como he dicho las rutas pueden ser relativas o absolutas, pero es recomendable las absolutas pero definitivamente evitar el determinismo del directorio de trabajo.
  • 2 parametros : Tener la copia de seguridad junto original no es muy útil si sufrimos una perdida de información. Es evidentemente recomendable tener la copia en un disco distinto al original. Por tanto:
    • 1er parametro : carpeta que queremos salvar.
    • 2º parametro : destino de la copia de seguridad
  • Alguna cosas más importantes:
    • .rsyncExcluir : se hace un listado de directorios y archivos que se excluyen de la copia de seguridad. Si no existe se crea excluyendo a si mismo y al destino de la copia de seguridad. Para evitar hacer una copia de la copia :/
    • En copia_de_$nombre/principal/ : Esta es la copia más reciente, y si ejecutas tu comando con cierta frecuencia es una copia exacta del original.
    • En copia_de_$nombre/incrementales/ : Se crea un incremental por día, (excepto si en ese día no hubo cambios). Tal y como esto en AÑO-MES-DIA, no sería dificil cambiar el date para realizar otro tipo de partición. Si especificamos hora y minuto podría ser excesivamente particionado. Podríamos cambiar el script para agrupar por otros criterios, por ejemplo fecha+turno (grupo de mañana o de tarde), o por numero de la semana si las copias de seguridad son semanales. En los incrementos solo se guarda el cambio respecto al principal que se hizo ese día.
  • Asi que simplemente hacer gedit copiaSeguridad , copy & paste  y darle permisos.
#!/bin/sh
#
# :: Invasion Tux
# :: Ultima modificacion : lunes, 09 de febrero de 2009
# :: Script realizado por makiolo (makiolo@gmail.com)  (Licencia Creative Commons con reconocimiento)
# :: Ultima version : https://blogricardo.wordpress.com/2009/02/08/script-para-hacer-copias-de-seguridad-incrementales
# :: Dependencias : rsync
#

################################# VARIABLES ##############################################

if [ $# -eq 0 ]; then
	# Directorio que queremos salvar
	DIRECTORIO_A_SALVAR=`pwd`

	# construir nombre subdirectorio
	NOMBRE_MES_ANIO=`date +"el_mes_%m_del_%Y"`
	NOMBRE_SALVADO=`basename $DIRECTORIO_A_SALVAR`
	SUB_DIRECTORIO_A_SALVAR="copia_de_"$NOMBRE_SALVADO"_en_"$NOMBRE_MES_ANIO

	# directorio donde se guarda el backup
	DESTINO_DE_LA_COPIA=$DIRECTORIO_A_SALVAR/$SUB_DIRECTORIO_A_SALVAR
elif [ $# -eq 1 ]; then
	# Directorio que queremos salvar
	DIRECTORIO_A_SALVAR=$1

	# construir nombre subdirectorio
	NOMBRE_MES_ANIO=`date +"el_mes_%m_del_%Y"`
	NOMBRE_SALVADO=`basename $DIRECTORIO_A_SALVAR`
	SUB_DIRECTORIO_A_SALVAR="copia_de_"$NOMBRE_SALVADO"_en_"$NOMBRE_MES_ANIO

	# directorio donde se guarda el backup
	DESTINO_DE_LA_COPIA=$DIRECTORIO_A_SALVAR/$SUB_DIRECTORIO_A_SALVAR
elif [ $# -eq 2 ]; then
	# Directorio que queremos salvar
	DIRECTORIO_A_SALVAR=$1

	# construir nombre subdirectorio
	NOMBRE_MES_ANIO=`date +"el_mes_%m_del_%Y"`
	NOMBRE_SALVADO=`basename $DIRECTORIO_A_SALVAR`
	SUB_DIRECTORIO_A_SALVAR="copia_de_"$NOMBRE_SALVADO"_en_"$NOMBRE_MES_ANIO

	# directorio donde se guarda el backup
	DESTINO_DE_LA_COPIA=$2/$SUB_DIRECTORIO_A_SALVAR
else
	echo "Numero de parametros incorrecto"
	exit
fi

# Archivos donde listamos las exlusiones de la backup
FICHERO_DE_EXCLUSION=$DIRECTORIO_A_SALVAR/.rsyncExcluir

# subdirectorio donde se guarda la copia principal
COPIA_PRINCIPAL=$DESTINO_DE_LA_COPIA/principal

# subdirectorios donde se guardan las copias incrementales
COPIA_INCREMENTOS=$DESTINO_DE_LA_COPIA/incrementales

# ruta variable de copias incrementales
COPIA_INCREMENTOS_VARIABLE=$COPIA_INCREMENTOS/`date | awk '{print $3}'`

# opciones de rsync , mejor no tocar
OPCIONES="--force --ignore-errors --delete --delete-excluded \
 --exclude-from=$FICHERO_DE_EXCLUSION --backup --backup-dir=$COPIA_INCREMENTOS_VARIABLE -av"

################################# FUNCIONES ##############################################
ejecutarRsync()
{
	if [ ! -f $FICHERO_DE_EXCLUSION ]; then
		echo `basename $DESTINO_DE_LA_COPIA`"/" > $FICHERO_DE_EXCLUSION
		echo ".rsyncExcluir" >> $FICHERO_DE_EXCLUSION
		echo "*~" >> $FICHERO_DE_EXCLUSION
	fi
	rsync $OPCIONES $DIRECTORIO_A_SALVAR $COPIA_PRINCIPAL
}

################################# MAIN ##############################################

# nos aseguramos de que existen los directorio de destino de la copia de seguridad
mkdir -p $DESTINO_DE_LA_COPIA
mkdir -p $COPIA_PRINCIPAL
mkdir -p $COPIA_INCREMENTOS

if [ ! -d $DIRECTORIO_A_SALVAR ]; then
	echo "No se encontro el directorio a salvar : $DIRECTORIO_A_SALVAR";
elif [ ! -d $DESTINO_DE_LA_COPIA ]; then
	echo "No se encontro el directorio de destino de la copia : $DESTINO_DE_LA_COPIA";
else
	ejecutarRsync
fi

Es un script excelente para combinarlo con un cron 24h.

Si no entendeis para que sirve el script o no sabeis que es una copia incremental –> google xD, no hombre podeis preguntarmelo y eso xD

Tambien si encontrais algún bug os lo agradeceré mucho que lo comenteis.