我正在使用类似时间机器的备份脚本,它使用硬链接创建到外部驱动器的部分备份:
#!/bin/bash
date=`date "+%Y-%m-%dT%H-%M-%S"`
backup=/mnt/backup
targets="/ /data/seafile /boot /boot/efi"
mkdir -p $backup/logs
rsync -a \
--stats \
--partial \
-h \
-H \
-A \
-X \
-x \
--log-file=$backup/logs/$date.log \
--exclude='/media/**' --exclude='/mnt/**' --exclude='/proc/**' --exclude='/sys/**' --exclude='/tmp/**' --exclude='/run/**' --exclude='/dev/**' \
$targets \
--link-dest=$backup/latest \
$backup/incomplete_$date \
&& mv $backup/incomplete_$date $backup/$date \
&& rm -f $backup/latest \
&& ln -s $backup/$date $backup/latest
结果:
/mnt/backup/
├── 2016-05-24T16-33-08
...
├── 2016-12-01T22-04-25
├── 2016-12-05T20-29-52
├── latest -> /mnt/backup/2016-12-05T20-29-52
├── logs
└── lost+found
到目前为止,这工作得很好,直到我开始使用 LVM 并将我的数据分割到不同的安装点。现在这些备份的内容如下所示:
/mnt/backup/latest
├── bin
├── boot
├── data
...
├── efi
...
├── seafile
...
我真正的意图是 rsync 将列表中的每个项目复制/ /data/seafile /boot /boot/efi
到层次结构中的正确位置,因此例如文件夹应该像这样结束:
/mnt/backup/latest
├── boot
│ ├── efi
...
├── data
│ └── seafile
我必须指定每个目标的原因是-x
选项。这会阻止 rsync 在递归过程中跨越文件系统边界。一个“简单”的解决方案是:
- 删除
-x
标志 - 仅指定
/
为目标
但这给我带来了一些额外的缺点。例如,我必须使用附加标签排除任何不需要的安装点--exclude='/.../**'
。目前这些还不算太多,但我宁愿有一个选择加入而不是选择退出的解决方案。
答案1
您应该能够使用-R
(或--relative
) 标志获得您想要的效果。在目标中再现源的完整路径,例如rsync -aR /a/b/c /dest
将创建一个目录/dest/a/b/c
。
您--link-dest
应该仍然可以工作,但只有在完成第一个新副本后,您可能更愿意在上次备份中移动目录以匹配新的层次结构,否则不会创建所有硬链接。