我在 linux 系统上使用 rsync 来同步本地磁盘和连接的 USB 驱动器之间的目录。我遇到的问题是,每天在服务器上创建备份的第 3 方系统实际上更改了嵌套在备份深处的目录的名称。此目录包含备份所需的大部分数据。当 rsync 查看目录时,它看到名称已更改,并认为它是一个全新的目录。所以我在 USB 驱动器上的 rsync 副本在它运行的每一天都有一个新目录。
我已经编写了脚本,实际上会将目录名称改回来,但这样做很麻烦!
我正在寻找一种“优雅”的方式来处理这个问题。是否可以创建指向保持不变的目录的链接?可以配置 rsync 以检测目录是否相同,即使名称已更改?我相信以前有人不得不处理这个问题!
一种方法是分两步进行。第一,使用忽略模式来同步除有问题的目录之外的所有内容。2nd, rsync 只是使用 bash 中的 globbing 来访问目录的目录,如下所示:
在源目录上使用尾部斜杠将有效地导致 rsync 忽略目录名称,因为它将在目录内容而不是目录本身上调用。当然,如果目录以常量前缀或后缀命名,如我上面的示例所示,这种通配将是最简单的。如果不是,您可以编写一个脚本来确定目录的实际名称,并执行如下更直接的操作:
最后,您的伪代码将是这样的:
您可以使用 rsync 选项--compare-dest=DIR、--copy-dest=DIR或--link-dest=DIR。它们允许您在接收端指定一个附加目录以查找丢失的文件。
例如,使用 --link-dest , rsync 将创建目录的新版本,其中包含已更改文件的新副本,或者未更改的文件的硬链接副本。
要使用这些选项中的任何一个,您必须知道上一次 rsync 运行时 USB 驱动器上的目录名称,因此您可能需要将 rsync 包装在一个脚本中,该脚本首先确定正确的目录名称。
您可能还想在创建新版本后使用 --delete-after 删除旧版本的目录。
单独的 rsync 不能做你想做的事情,因为 rsync 唯一可用的元数据是目录名称和 MACtimes。
在 rsync 内部自动处理它的唯一方法是让 rsync 以某种方式拥有更多元数据。例如,Microsoft 在 Windows 上的 DFS 复制通过使用分配给 NTFS 卷中文件的唯一 ID 来处理此问题,以捕捉文件(或目录)名称何时更改。
你不优雅的脚本可能是最简单的方法来做你想做的事情,而无需转储 rsync 并寻找另一个工具。
使用符号链接是行不通的,因为连接点与目标目录的名称相关联(在这种情况下,目标目录名称会发生变化)。您可以使用硬链接(与 inode 相关联),但您需要确保目录名称正在更改,而不仅仅是被删除和重新创建(这将为其分配不同的 inode)。