我有两台计算机(均为 MacBook Air),我在两台计算机中同步一个目录树,但不同步整个硬盘或任何其他目录。
假设在计算机上A
目录是/Users/aellett/projects
假设在计算机上B
目录是/Users/bellett/projects
通常,我会登录计算机B
,然后A
以用户“aellett”的身份远程连接到计算机。作为超级用户,我按如下方式同步两个项目目录:
rsync -av /Volumes/aellett/projects/ /Users/bellett/projects/
并且一切按预期工作。
在两台计算机上,我letter.txt
在另一个目录中还有另一个文件,该文件没有同步。
假设在计算机上A
找到该文件/Users/aellett/letters
在计算机上,B
该文件位于/Users/bellett/correspondence
一般来说,我不想分享未包含在内的东西/Users/<username>/projects
。但我确实想分享这个特定的文件。
因此,我在两台计算机上都创建了一个correspondence
目录projects
。然后我创建了如下硬链接
在计算机上A
:
ln /Users/aellett/letters/letter.txt /Users/aellett/projects/correspondence/letter.txt
在计算机上B
:
ln /Users/bellett/correspondence/letter.txt /Users/aellett/projects/correspondence/letter.txt
下次我同步两台计算机时,我做了以下操作
rsync -av -H /Volumes/aellett/projects/ /Users/bellett/projects/
当我在计算机上检查时B
,/Users/bellett/projects/correspondence/letter.txt
已正确同步。但是,到的硬链接/Users/bellett/correspondence/letter.txt
不再存在。换句话说,/Users/bellett/projects/correspondence/letter.txt
与 相同/Users/aellett/projects/correspondence/letter.txt
但与 不同/Users/bellett/correspondence/letter.txt
。由于这两个文件在两台计算机上都是硬链接的,我预计它们仍然具有硬链接。
为什么我的硬链接没有被保留?
答案1
我不确定我能解释得比rsync
的手册页做:
-H,--硬链接 这告诉 rsync 在传输中查找硬链接文件,并将接收端的相应文件链接在一起。如果没有此选项,传输中的硬链接文件将被视为单独的文件。
当您更新非空目标时,此选项仅确保在源上硬链接在一起的文件在目标上硬链接在一起。它目前不会试图破坏目标上已经存在的、源文件之间不存在的硬链接。但请注意,如果一个或多个额外链接的文件有内容更改,它们将在更新时取消链接(假设您没有使用- 到位选项)。
请注意,rsync 只能检测传输集内文件之间的硬链接。如果 rsync 更新的文件与传输集外的文件有额外的硬链接连接,则该链接将被破坏。如果您试图使用- 到位为避免这种破坏,请务必小心,了解文件是如何更新的,以确保不会因残留的硬链接而发生意外更改(并参阅- 到位选项以了解更多警告)。
请注意,这-a
并不意味着-H
,即使您添加-H
链接的另一侧不是同一传输的一部分(并且不能是,因为周围的目录结构不同),rsync
也无法同时看到链接的两侧,因此无法在两个位置更新链接的文件。也就是说,当它更新/Users/bellett/projects/correspondence/letter.txt时,它可以判断它链接到其他内容(通过链接计数),但不知道该链接存在于何处。--inplace
可能会解决问题,但也可能导致其他问题;请参阅手册页中的相关部分。