我的照片保存在外部磁盘上,通过手动运行使用 rsync 的脚本将其备份到服务器。此脚本可确保我的外部磁盘和备份保持同步,这意味着复制所有新照片并删除从外部磁盘删除的所有照片。
我使用以下命令来实现这一点:
rsync -av --exclude '.*' --delete $SRC/ $HOST:/path/to/backup
多年来,这种方法一直运行良好。但是,现在我的外部磁盘空间已经用完了,所以我又买了一个。我打算在新磁盘上保留与旧磁盘相同的目录结构,例如:
Events/
2023-05 Event1/
2023-07 Event2/
Travel/
2023-06 Trip1/
2023-07 Trip2/
问题:
我可以以某种方式修改我的 rsync 备份脚本以将我的两个外部磁盘合并到我的服务器上的单个备份文件夹中吗?
例子:
我有两个具有类似结构的源目录:
Source1/
A/
1/
2/
3/
B/
10/
20/
Source2/
A/
4/
5/
B/
30/
我希望我的目标包含来自两者的文件和目录,并使用相同的目录结构:
Destination/
A/
1/
2/
3/
4/
5/
B/
10/
20/
30/
我能否以某种方式实现这一点,同时仍确保从源目录中删除的文件也从目标目录中清除(使用 --delete 标志)?
答案1
我假设你想把旧驱动器保留为一个“活动”源,你将继续从中删除和添加内容,并且你绝对地想要将两个驱动器合并到同一个目录中吗?
我不认为使用 rsync 单行命令可以做到这一点,据我所知 rsync 只处理单个源;它无法知道目标中的文件夹是来自一个源的已删除文件夹(应该删除)还是另一个源中的现有文件夹(应该保留),并且默认情况下会从您未同步的驱动器中删除所有内容。
如果我们愿意将其制作成一个(小)脚本:您可以构建源 B 上的文件列表,然后在同步源 A 时将其用作 rsync 中的排除列表,反之亦然,并继续使用相同的 rsync 调用,除了额外的排除列表。这应该使得 rsync 不会从其他磁盘删除文件,但会删除不在任何驱动器上的内容。但是,它将使用最后同步的驱动器覆盖具有相同路径的文件。
我们最终会得到这样的结果(这是未经测试,校正和测试留给读者,在样本数据上尝试一下,等等)
find ${drive_A_syncroot}/* | xargs realpath --relative-to=${drive_A_syncroot} > exclusion-list-A.csv
find ${drive_B_syncroot}/* | xargs realpath --relative-to=${drive_B_syncroot} > exclusion-list-B.csv
rsync -av --exclude '.*' --exclude-from=exclusion-list-B.csv --delete ${drive_A_syncroot}/ $HOST:/path/to/backup
rsync -av --exclude '.*' --exclude-from=exclusion-list-A.csv --delete ${drive_B_syncroot}/ $HOST:/path/to/backup