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
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