Crie um backup diferencial com rsync de um diretório na minha unidade local para outro diretório na mesma unidade

Crie um backup diferencial com rsync de um diretório na minha unidade local para outro diretório na mesma unidade

Como posso usar o rsync (mas nem o rsnapshot, nem o rdiff-backup, nem qualquer outro aplicativo) para criar umdiferencialbackup de um diretório localizado na minha unidade local para outro diretório localizado na mesma unidade local?

F. Hauri postou o seguinte emuma resposta paraComo criar um backup 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 o script acima está bem próximo do que eu quero, mas francamente, apesar de passar cerca de uma hora estudandoBackups fáceis e automatizados em estilo snapshot com Linux e RsyncAinda tenho apenas uma vaga ideia de como fazer o rsync fazer o que eu quero.

Aqui está meu caso de uso:

Estou editando um vídeo localmente em minha máquina. A soma de todas as centenas de arquivos associados a esse vídeo será inferior a 5 GB (cinco gigabytes).

Atualmente, uso o Grsync para fazer backup da minha unidade interna em uma unidade USB externa. Embora eu realmente tenha descoberto como realizar a tarefa idêntica usando o rsync, prefiro usar o Grsync porque só preciso iniciá-lo e clicar em um botão para fazer backup do meu diretório interno que contém meus arquivos de vídeo para minha unidade USB externa. Todo o processo é suave como a seda.

A cada poucas horas, desejo uma maneira bastante fácil de fazer backup dos dados mencionados acima associados ao meu vídeo para minha conta do Google Drive. Não me importo de escolher manualmente fazer upload de uma pasta para o Google Drive. Na verdade, prefiro fazer isso porque me ajudaria a garantir que o backup estava realmente sendo realizado.

Todas as noites, antes de ir para a cama, copio toda a pasta que contém os arquivos de vídeo, que contém muitos gigabytes de dados, para minha conta do Google Drive.

Prefiro backups diferenciais aos incrementais porque, caso eu precisasse restaurar meus dados do Google Drive, provavelmente conseguiria fazer isso manualmente sem ficar confuso.

Tenha em mente que certamente não sou administrador de sistemas Unix em uma grande empresa que oferece suporte a centenas de usuários. Sou apenas um cara que deseja um método fácil, mas não necessariamente um método totalmente automatizado, para fazer backup de seus dados fora do local a cada poucas horas, no caso de uma perda catastrófica de dados, o que provavelmente seria devido ao roubo do meu computador . Tenho quase certeza de que o rsync pode fazer o que eu quiser. Portanto, estou relutante em instalar outro aplicativo.

Responder1

Aqui está!

#!/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 exemplo, meu diretório atual possui 3 arquivos de 8k:

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

Meu backup completo ainda não existe, vamos chamar esse diretório de full_bak

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

Primeiro precisamos de um backup completo para fazer os diferenciais. Copiei o script para meu diretório $HOME/bin como test123.sh. Quando os dois argumentos são iguais, isso significa essencialmente realizar um backup completo.

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

saídas de script

.
seg1
seg2
seg3

Agora olhe para ../full_bak

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

Faça algumas mudanças

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

Confirme que há diferenças:

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

Agora crie um diferencial

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

Veja o diferencial de ter apenas o arquivo diferente do último backup completo

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

Faça outra mudança

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

Confira o que há de diferente

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

e vemos que temos um novo arquivo que não está em nosso backup completo e um arquivo alterado anterior.

Faça outro diferencial para outro diretório

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

e veja o novo diferencial tem o 1º diferencial assim como o novo arquivo

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

Backups diferenciais

Aqui está um wrapper de backup completo usando test123.sh:

#!/bin/bash

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

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

Aqui está um script diferencial criando subdiretórios com base na 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

informação relacionada