Crear una copia de seguridad diferencial con rsync de un directorio en mi disco local a otro directorio en el mismo disco

Crear una copia de seguridad diferencial con rsync de un directorio en mi disco local a otro directorio en el mismo disco

¿Cómo puedo usar rsync (pero ni rsnapshot ni rdiff-backup ni ninguna otra aplicación) para crear undiferencial¿Copia de seguridad de un directorio ubicado en mi disco local en otro directorio ubicado en ese mismo disco local?

F. Hauri publicó lo siguiente enuna respuesta a¿Cómo crear una copia de seguridad local?:

#!/bin/bash
backRepo=/media/mydisk
backSrce=/home/user
backDest=home
backCopy=copy
backCount=9

[ -d "$backRepo/$backDest" ] || mkdir "$backRepo/$backDest"

cd $backSrce || exit 1
rsync -ax --delete --exclude '*~' --exclude '.DStore' . "$backRepo/$backDest/."

cd $backRepo
[ -d "$backCopy.$backCount" ] && rm -fR "$backCopy.$backCount"
for ((i=$backCount;i--;));do
    [ -d "$backCopy.$i" ] && mv "$backCopy.$i" "$backCopy.$((i+1))"
  done
((i++))

cp -al $backDest $backCopy.$i

Parece que el guión anterior se acerca bastante a lo que quiero, pero, francamente, a pesar de pasar aproximadamente una hora estudiandoCopias de seguridad sencillas y automatizadas tipo instantánea con Linux y RsyncTodavía tengo una vaga idea de cómo hacer que rsync haga lo que quiero.

Aquí está mi caso de uso:

Estoy editando un video localmente en mi máquina. La suma de los cientos de archivos asociados con ese vídeo será inferior a 5 GB (cinco gigabytes).

Actualmente, uso Grsync para hacer una copia de seguridad de mi disco interno en una unidad USB externa. Aunque en realidad descubrí cómo realizar la misma tarea usando rsync, prefiero usar Grsync porque simplemente necesito iniciarlo y luego hacer clic en un botón para hacer una copia de seguridad de mi directorio interno que contiene mis archivos de video en mi unidad USB externa. Todo el proceso es suave como la seda.

Cada pocas horas, quiero una manera bastante sencilla de hacer una copia de seguridad de los datos mencionados anteriormente asociados con mi video en mi cuenta de Google Drive. No me importa elegir cargar manualmente una carpeta en Google Drive. De hecho, prefiero tener que hacerlo porque me ayudaría a garantizar que la copia de seguridad realmente se esté realizando.

Cada pocas noches, antes de irme a la cama, copio toda la carpeta que contiene los archivos de vídeo, que contiene muchos gigas de datos, en mi cuenta de Google Drive.

Prefiero las copias de seguridad diferenciales a las incrementales porque, en caso de que tuviera que restaurar mis datos desde Google Drive, probablemente podría hacerlo manualmente sin confundirme.

Tenga en cuenta que ciertamente no soy un administrador de sistemas Unix en una gran corporación que brinda soporte a cientos de usuarios. Soy simplemente una persona que quiere un método fácil, pero no necesariamente un método completamente automatizado, para hacer una copia de seguridad de sus datos fuera del sitio cada pocas horas en caso de una pérdida catastrófica de datos, que probablemente se deba al robo de mi computadora. . Estoy casi seguro de que rsync puede hacer lo que quiero. Por tanto, soy reacio a instalar otra aplicación.

Respuesta1

¡Aqui tienes!

#!/bin/bash

# written by strobelight, you know who you are.
# license, MIT, go for it.

me=`basename $0`

EXCLUDES="\
    --exclude '*~'
    --exclude '.DS_Store'
"

CANDIDATES=/tmp/candidates

usage() {
    cat <<EOF

$me last_diff_dir new_diff_dir [ dir_to_copy ]

where:
    last_diff_dir  is the directory containing the last differential
    new_diff_dir   is the directory you want files saved to
    dir_to_copy    is optional and is the directory to copy from (default .)

cd directory_to_backup
Full backup: $me full_back full_back
Diff backup: $me full_back diff_1
Diff backup: $me full_back diff_2

EOF
    exit 1
}

get_dir() {
    HERE=`pwd`
    cd $1
    x=`pwd`
    cd $HERE
    echo $x
}

if [ $# -lt 2 ]; then
    usage
fi

LAST_DIR="$1"
NEW_DIR="$2"
DIR_TO_COPY="${3:-.}"

mkdir -p "$LAST_DIR" || exit 1
mkdir -p "$NEW_DIR" || exit 1

[ -d "$LAST_DIR" ] || usage
[ -d "$NEW_DIR" ] || usage
[ -d "$DIR_TO_COPY" ] || usage

LAST_DIR=`get_dir "$LAST_DIR"`
NEW_DIR=`get_dir "$NEW_DIR"`
DIR_TO_COPY=`get_dir "$DIR_TO_COPY"`

# get list of what's different
eval rsync -v --dry-run -axH --delete --update $EXCLUDES "$DIR_TO_COPY/" "$LAST_DIR" | awk '
    /building file list/ { next }
    /^$/ {next}
    /bytes.*received/ { nextfile }
    {
        for(i=5;i<NF;i++) {
            printf("%s ",$i)
        }
        printf("%s\n",$NF)
    }
    ' | sed 's:/$::' > $CANDIDATES
#cat $CANDIDATES

# use list to backup 
eval rsync --files-from=$CANDIDATES -lptgoDxH --delete $EXCLUDES ${DIR_TO_COPY}/ $NEW_DIR

Por ejemplo, mi directorio actual tiene 3 archivos de 8k:

$ ls -1sk
total 24
 8 seg1
 8 seg2
 8 seg3

Mi copia de seguridad completa aún no existe, llamemos a ese directorio full_bak

ls ../full_bak
ls: ../full_bak: No such file or directory

Primero necesitamos una copia de seguridad completa desde la cual hacer diferenciales. Copié el script en mi directorio $HOME/bin como test123.sh. Cuando ambos argumentos son iguales, esencialmente se realiza una copia de seguridad completa.

$HOME/bin/test123.sh ../full_bak ../full_bak

salidas de script

.
seg1
seg2
seg3

Ahora mira ../full_bak

$ ls -1sk ../full_bak
total 24
 8 seg1
 8 seg2
 8 seg3

Haz algunos cambios

dd if=/dev/zero of=seg2 bs=512 count=11

Confirme que hay diferencias:

$ diff -q . ../full_bak
Files ./seg2 and ../full_bak/seg2 differ

Ahora crea un diferencial

$ $HOME/bin/test123.sh ../full_bak ../differential1
seg2

Mire el diferencial que tiene solo el archivo que es diferente de la última copia de seguridad completa.

$ ls -1sk ../differential1/
total 8
 8 seg2

hacer otro cambio

dd if=/dev/zero of=seg4 bs=512 count=10

Comprueba qué es diferente

diff -q . ../full_bak
Files ./seg2 and ../full_bak/seg2 differ
Only in .: seg4

y vemos que tenemos un archivo nuevo que no está en nuestra copia de seguridad completa y un archivo modificado desde antes.

Hacer otro diferencial a otro directorio

$ $HOME/bin/test123.sh ../full_bak ../differential2
.
seg2
seg4

y vea que el nuevo diferencial tiene el primer diferencial así como el nuevo archivo

$ ls -1sk ../differential2
total 16
 8 seg2
 8 seg4

Copias de seguridad diferenciales

Aquí hay un contenedor de copia de seguridad completa que usa test123.sh:

#!/bin/bash

FULLDIR=/media/mydisk/home
SRCDIR=/home/user

$HOME/bin/test123.sh $FULLDIR $FULLDIR $SRCDIR

Aquí hay un script diferencial que crea subdirectorios según la hora:

#!/bin/bash

FULLDIR=/media/mydisk/fullbackup/home
DIFFDIR=/media/mydisk/differentials/home
SRCDIR=/home/user
DIFFSUB=`date '+BAK_%H'`

$HOME/bin/test123.sh $FULLDIR $DIFFDIR/$DIFFSUB $SRCDIR

información relacionada