使用rsync复制多个目录到同一位置;保留树

使用rsync复制多个目录到同一位置;保留树

我正在使用类似时间机器的备份脚本,它使用硬链接创建到外部驱动器的部分备份:

#!/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应该仍然可以工作,但只有在完成第一个新副本后,您可能更愿意在上次备份中移动目录以匹配新的层次结构,否则不会创建所有硬链接。

相关内容