rsync --delete 不删除所有已删除的文件

ale*_*ich 7 rsync

我正在使用 rsync 将多个系统备份到外部硬盘驱动器或通过网络备份到另一台机器。想法是维护原始文件系统的副本,其中包含一些内容,例如 /dev、/proc、/mnt 以及未排除的内容,然后在目标(即使用 btrfs 或 zfs)进行快照。为此,我使用了一个命令

rsync -avP --delete --exclude /dev/* --exclude /proc/* --exclude /mnt/* etc. etc. / backup@fileserver:/mnt/array/backup/machine/
Run Code Online (Sandbox Code Playgroud)

哪个工作得相当好。但是,我只是注意到 rsync 不能可靠地删除目标上的内容。因此,目标上的文件比源上任何时候都多得多,在一种情况下,备份比源大 100 GB。剩余的文件似乎大多是各种软件和库的旧版本。比如在原机上,/usr/include/qt/QtWidgets/包含

5.9.2
QAbstractButton
qabstractbutton.h
....
Run Code Online (Sandbox Code Playgroud)

但是在备份目标上,同一文件夹包含:

5.6.0
5.6.1
5.7.0
5.7.1
5.8.0
5.9.0
5.9.1
5.9.2
QAbstractButton
qabstractbutton.h
Run Code Online (Sandbox Code Playgroud)

rsync 似乎可以很好地复制新文件,但忘记删除所有旧文件。奇怪的是,有些文件实际上被删除了(rsync 在同步时总是报告删除了很多文件),但似乎实际上并没有删除许多文件。结果,我的备份占用了比应有的更多空间,并且无法直接恢复它们,因为由于所有额外的文件,它们可能占用比原始分区更多的空间,以及诸如平面之类的东西文件包数据库都搞砸了,包含许多旧版本包的重复条目。

关于这里可能发生什么的任何想法?我需要传递给 rsync 的其他标志,以便它实际上删除它应该删除的所有内容吗?

B L*_*yer 8

一些关于尝试的建议来自手册页的内容(关于部分--delete)。有很多警告和警告。你考虑过所有这些吗?

  • 仅适用于“正在同步的目录”。我想这意味着他们必须复制父/祖先目录。

  • 同样,它不适用于任何被明确排除的内容:

从传输中排除的文件也不会被删除,除非您使用该--delete-excluded 选项或将规则标记为仅在发送方匹配。

  • 如果发送方检测到任何 I/O 错误,则将自动禁用在目的地删除任何文件。覆盖--ignore-errors

  • 先试试--dry-run?结合--verbose并仔细检查问题目录中发生的所有事情。

    如果使用不当,此选项可能很危险!首先尝试使用 --dry-run 选项 (-n) 运行以查看将要删除的文件是一个非常好的主意。

因此,请考虑尝试--delete-excluded,--ignore-errors和/或--dry-run/ --verbose... 不一定是“修复”,但至少可以收集有用的数据。

另外,看看--delete-before国旗。这应该在实际传输之前进行接收方删除。同样,这可能无法解决所有问题,但可能会有所启发。看看它是否也有助于减少磁盘空间使用会很有趣。