Aqui está você!
#!/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 tem 3 arquivos 8k:
$ ls -1sk
total 24
8 seg1
8 seg2
8 seg3
Meu backup completo ainda não existe, vamos chamar esse diretório full_bak
ls ../full_bak
ls: ../full_bak: No such file or directory
Primeiro, precisamos de um backup completo para fazer diferenciais. Eu copiei o script para meu diretório $ HOME / bin como test123.sh. Quando os dois argumentos são os mesmos, essencialmente, está executando 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 alterações
dd if=/dev/zero of=seg2 bs=512 count=11
Confirme se existem 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 tendo apenas o arquivo diferente do último backup completo
$ ls -1sk ../differential1/
total 8
8 seg2
Faça outra alteração
dd if=/dev/zero of=seg4 bs=512 count=10
Verifique o que é 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 de antes.
Faça outro diferencial em 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 que cria subdiretórios baseados 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