我如何使用 rsync(而不是 rsnapshot、rdiff-backup 或任何其他应用程序)来创建微分将位于我本地驱动器上的目录备份到位于同一本地驱动器上的另一个目录?
F. Hauri 在答案如何创建本地备份?:
#!/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
上面的脚本似乎非常接近我想要的,但坦率地说,尽管我花了一个小时左右的时间研究使用 Linux 和 Rsync 轻松实现自动快照式备份我对如何让 rsync 完成我想要做的事情仍然只有一个模糊的想法。
这是我的用例:
我正在我的机器上本地编辑视频。与该视频相关的数百个文件的总大小将小于 5 gb(5 GB)。
目前,我使用 Grsync 将我的内置驱动器备份到外置 USB 驱动器。虽然我实际上已经弄清楚了如何使用 rsync 完成相同的任务,但我更喜欢使用 Grsync,因为我只需要启动它,然后单击一个按钮即可将包含视频文件的内部目录备份到外置 USB 驱动器。整个过程非常顺畅。
每隔几个小时,我都想以相当顺畅的方式将上述与我的视频相关的数据备份到我的 Google Drive 帐户。我不介意手动选择将文件夹上传到 Google Drive。实际上我更喜欢这样做,因为它可以帮助我确保备份确实完成。
每隔几天晚上睡觉前,我都会将包含视频文件的整个文件夹(其中包含许多 GB 的数据)复制到我的 Google Drive 帐户中。
我更喜欢差异备份而不是增量备份,因为如果我需要从 Google Drive 恢复我的数据,我很可能能够手动进行恢复而不会感到困惑。
请记住,我绝对不是一家支持数百名用户的大公司的 Unix 系统管理员。我只是一个人,想要一种简单的方法,但不一定是完全自动化的方法,每隔几个小时就将数据备份到异地,以防发生灾难性的数据丢失,这很可能是由于我的电脑被盗造成的。我几乎可以肯定 rsync 可以满足我的要求。因此,我不愿意安装另一个应用程序。
答案1
给你!
#!/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
例如我当前目录有3个8k文件:
$ ls -1sk
total 24
8 seg1
8 seg2
8 seg3
我的完整备份尚不存在,我们将该目录称为 full_bak
ls ../full_bak
ls: ../full_bak: No such file or directory
首先,我们需要一个完整备份,以便进行差异分析。我已将脚本复制到我的 $HOME/bin 目录中,名为 test123.sh。当两个参数相同时,这实际上是在执行完整备份。
$HOME/bin/test123.sh ../full_bak ../full_bak
脚本输出
.
seg1
seg2
seg3
现在看看../full_bak
$ ls -1sk ../full_bak
total 24
8 seg1
8 seg2
8 seg3
做出一些改变
dd if=/dev/zero of=seg2 bs=512 count=11
确认有差异:
$ diff -q . ../full_bak
Files ./seg2 and ../full_bak/seg2 differ
现在创建一个微分
$ $HOME/bin/test123.sh ../full_bak ../differential1
seg2
查看差异文件,其中只有与上次完整备份不同的文件
$ ls -1sk ../differential1/
total 8
8 seg2
进行另一项更改
dd if=/dev/zero of=seg4 bs=512 count=10
检查有何不同
diff -q . ../full_bak
Files ./seg2 and ../full_bak/seg2 differ
Only in .: seg4
发现我们有一个不在我们的完整备份中的新文件,以及一个之前更改的文件。
对另一个目录进行另一次差异处理
$ $HOME/bin/test123.sh ../full_bak ../differential2
.
seg2
seg4
并看到新的差分文件包含第一个差分文件和新文件
$ ls -1sk ../differential2
total 16
8 seg2
8 seg4
以下是使用 test123.sh 的完整备份包装器:
#!/bin/bash
FULLDIR=/media/mydisk/home
SRCDIR=/home/user
$HOME/bin/test123.sh $FULLDIR $FULLDIR $SRCDIR
以下是根据小时创建子目录的差异脚本:
#!/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