为什么 Finder 和 rsync 在处理点文件时会有差异?

为什么 Finder 和 rsync 在处理点文件时会有差异?

从两个文件开始

~/foo/bar1.txt
~/foo/bar2.txt

在我的 Mac 根卷上,我将文件夹~/foo(很大;这只是示例)复制到/Volumes/Kiwi。根据过去的经验,我知道 Finder 比 快很多rsync,因此我仅使用 Finder 进行初始复制。这将创建以下文件。

/Volumes/Kiwi/foo/bar1.txt
/Volumes/Kiwi/foo/bar2.txt

我现在想使用以下方式进行持续备份rsync而不是通过 Finder 进行持续备份(因为它将是增量的)。(我知道并使用 Time Machine;TM 可以完成它的工作,我想做自己的冗余副本。)

如果我编辑~/foo/bar1.txt以模拟更改(但没有bar2.txt),然后运行

rsync --dry-run -avz  ~/foo/  /Volumes/Kiwi/foo/

一切顺利。rsync表示只会bar1.txt被复制,而不会bar2.txt

但是如果 Finder 也复制了一个文件~/foo/._bar3.txtrsync即使我没有动过它,它也会复制该文件。为什么?

这不是什么大问题。rsync不会重复复制它,但仍然如此。Finder 和rsync -avz令人费解。我通过启动 Finder 然后切换到 来做一些愚蠢的事情吗rsync

细节

SSD 格式

外部磁盘使用 GUID 分区图和 APFS 格式化。

`rsync` 版本

我在用着:

> rsync --version
rsync  version 2.6.9  protocol version 29

因为我得到了

$ which rsync
/usr/bin/rsync

是 Ventura 附带的。是否有其他rsync表现不同的替代方案(Homebrew、MacPorts 等)?

答案1

简短回答:不用担心。这些并不是实际被复制的文件;这只是 Apple 版本的 rsync 通过本身不支持该协议 (rsync v2) 处理复杂文件元数据的一种产物。

长答案:Apple 的文件系统始终支持(并使用)各种形式的复杂(且非标准)文件系统元数据。如今,它主要是“扩展属性”,但过去它包括类型和创建者代码、Finder 标志和资源分支等内容。

在处理不支持复杂元数据(有时甚至不支持)的文件系统、存档格式、文件传输协议等时任何元数据),苹果的工具倾向于使用AppleDouble 格式,它将元数据拆分成一个带有“._”前缀的单独文件。当您将 Mac 文件复制到 FAT 或 exFAT 文件系统、将它们存档为 tar 或 zip 文件等时,您经常会看到这些文件出现(如果您寻找不可见文件)。

Apple 版本的 rsync 使用相同的方法来传输复杂的元数据。如果您使用rsync -E(或--extended-attributes),发送过程会将源文件的元数据转换为 AppleDouble,将其作为“._”伪文件传输,接收方会将其解码回元数据并确保目标文件设置正确。

由于这不是实际文件,因此 rsync 的常规更改检测技巧不起作用,因此它只是“始终传输”。还请注意,这甚至适用于源和目标在同一台计算机上的情况,因为 rsync 甚至在本地运行单独的发送方和接收方进程,并且它们通过与网络传输相同的协议进行通信。

最后,rsync 版本 3支持复杂元数据(前提是您使用正确的补丁编译它,并使用-X和可能的--fileflags选项),但其格式与 Apple 的自定义版本使用的格式不同(并且 Apple 因许可原因无法更新到 v3)。因此,如果您在使用 Apple 版本的计算机和运行 rsync v3 的计算机之间进行传输,您可能会遇到兼容性问题。

相关内容