使用 rsync 将本地驱动器上的目录创建到同一驱动器上的另一个目录的差异备份

Yek*_*iel 6 linux backup rsync

我如何使用 rsync(但既不是 rsnapshot 也不是 rdiff-backup 也不是任何其他应用程序)来创建位于我本地驱动器上的目录到位于同一本地驱动器上的另一个目录的差异备份?

F. Hauri 在如何创建本地备份的 anwser 中发布了以下内容

#!/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
Run Code Online (Sandbox Code Playgroud)

看起来上面的脚本与我想要的非常接近,但坦率地说,尽管花了大约一个小时研究使用 Linux 和 Rsync 的简易自动快照式备份,但我仍然对如何让 rsync 做我想做的事情只有一个模糊的想法。

这是我的用例:

我正在我的机器上本地编辑视频。与该视频关联的所有数百个文件的总和将小于 5 GB(5 GB)。

目前,我使用 Grsync 将内部驱动器备份到外部 USB 驱动器。虽然我实际上想出了如何使用 rsync 完成相同的任务,但我更喜欢使用 Grsync,因为我只需要启动它,然后单击一个按钮即可将包含我的视频文件的内部目录备份到我的外部 USB 驱动器。整个过程如丝般顺滑。

每隔几个小时,我就想要一种相当流畅的方式将上述与我的视频相关的数据备份到我的 Google 云端硬盘帐户。我不介意手动选择将文件夹上传到 Google Drive。我实际上更喜欢必须这样做,因为它可以帮助我确保备份实际上已完成。

每隔几天晚上睡觉前,我都会将包含视频文件的整个文件夹复制到我的 Google Drive 帐户中,其中包含许多演出数据。

我更喜欢差异备份而不是增量备份,因为如果我需要从 Google Drive 恢复我的数据,我可能能够手动执行此操作而不会感到困惑。

请记住,我当然不是支持数百个用户的大公司的 unix 系统管理员。我只是一个人,想要一种简单的方法,但不一定是完全自动化的方法,每隔几个小时就在异地备份他的数据,以防发生灾难性的数据丢失,这很可能是由于我的计算机被盗造成的. 我几乎可以肯定 rsync 可以做我想做的事。因此,我不愿意安装另一个应用程序。

str*_*ght 0

给你!

#!/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
Run Code Online (Sandbox Code Playgroud)

比如我当前目录有3个8k文件:

$ ls -1sk
total 24
 8 seg1
 8 seg2
 8 seg3
Run Code Online (Sandbox Code Playgroud)

我的完整备份尚不存在,我们将该目录称为 full_bak

ls ../full_bak
ls: ../full_bak: No such file or directory
Run Code Online (Sandbox Code Playgroud)

首先我们需要一个完整的备份来进行差异化。我已将该脚本复制到我的 $HOME/bin 目录中,名称为 test123.sh。当两个参数相同时,这实际上是在执行完整备份。

$HOME/bin/test123.sh ../full_bak ../full_bak
Run Code Online (Sandbox Code Playgroud)

脚本输出

.
seg1
seg2
seg3
Run Code Online (Sandbox Code Playgroud)

现在看看../full_bak

$ ls -1sk ../full_bak
total 24
 8 seg1
 8 seg2
 8 seg3
Run Code Online (Sandbox Code Playgroud)

做一些改变

dd if=/dev/zero of=seg2 bs=512 count=11
Run Code Online (Sandbox Code Playgroud)

确认存在差异:

$ diff -q . ../full_bak
Files ./seg2 and ../full_bak/seg2 differ
Run Code Online (Sandbox Code Playgroud)

现在创建一个微分

$ $HOME/bin/test123.sh ../full_bak ../differential1
seg2
Run Code Online (Sandbox Code Playgroud)

查看差异,其中仅包含与上次完整备份不同的文件

$ ls -1sk ../differential1/
total 8
 8 seg2
Run Code Online (Sandbox Code Playgroud)

进行另一个更改

dd if=/dev/zero of=seg4 bs=512 count=10
Run Code Online (Sandbox Code Playgroud)

检查有什么不同

diff -q . ../full_bak
Files ./seg2 and ../full_bak/seg2 differ
Only in .: seg4
Run Code Online (Sandbox Code Playgroud)

并看到我们有一个不在完整备份中的新文件,以及之前更改过的文件。

对另一个目录进行另一个差异

$ $HOME/bin/test123.sh ../full_bak ../differential2
.
seg2
seg4
Run Code Online (Sandbox Code Playgroud)

并看到新的差异有第一个差异以及新文件

$ ls -1sk ../differential2
total 16
 8 seg2
 8 seg4
Run Code Online (Sandbox Code Playgroud)

差异备份

这是使用 test123.sh 的完整备份包装器:

#!/bin/bash

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

$HOME/bin/test123.sh $FULLDIR $FULLDIR $SRCDIR
Run Code Online (Sandbox Code Playgroud)

这是一个根据时间创建子目录的差异脚本:

#!/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
Run Code Online (Sandbox Code Playgroud)