rsync 的不同行为

rsync 的不同行为

据我所知,rsync没有-o-g选项意味着复制时不改变目标的所有者和组。然而,我发现了一个非常奇怪的行为,rsync我无法解释。一个例子总是比一个长篇大论的解释更好:

file1file2是2个文件,它们的组和所有者分别为user1:user1和user2:user2。

user1使用 sudoer运行以下指令(两行) :

touch file1

然后

touch file2 && sudo chown user2:user2 file2 && rsync file1 file2 && ls -l

结果是:

-rw-r--r-- 1 user1 user1 0 Jan 16 19:51 file1
-rw-r--r-- 1 user1 user1 0 Jan 16 19:53 file2

而运行以下指令时,仍然使用user1,一次性完成(1 行):

touch file1 && touch file2 && sudo chown user2:user2 file2 && rsync file1 file2 && ls -l

结果是:

-rw-r--r-- 1 user1 user1 0 Jan 16 19:51 file1
-rw-r--r-- 1 user2 user2 0 Jan 16 19:53 file2

总而言之,在第一种情况下,的所有权file2已被修改,而在第二种情况下,所有权尚未修改,它仍然是 user2:user2,这是的预期行为(除非我误解了)rsync

也许我错过了什么,但我找不到。你能解释一下吗?

先感谢您。

答案1

我认为你误解了 的功能rsync。以下是-o-g选项根据rsync 手册页

-o, --owner 此选项使 rsync 将目标文件的所有者设置为与源文件的所有者相同,但前提是接收 rsync 以超级用户身份运行(另请参阅 --super 和 --fake-super 选项)。若没有此选项,新文件和/或传输文件的所有者将被设置为接收方的调用用户。

-g, --group 此选项使 rsync 将目标文件的组设置为与源文件相同。如果接收程序未以超级用户身份运行(或者指定了 --no-super),则仅保留接收端调用用户所属的组。若没有此选项,则该组将被设置为接收端调用用户的默认组。

因为你是rsync在本地运行,是接收方的调用用户。如果我正确理解了手册页,则没有选项可以保留目标文件的所有者和组,只有源文件的所有者和组(通过使用-o-g选项) - 因此您看到的行为是正常的。

答案2

默认情况下,rsync 会以 1 秒的精度比较时间戳(尽管它会以尽可能高的精度传输它们)。结果如下:

  • 在第一种情况下,rsync 认为 file2 “过时”(因为其时间戳与源不同),因此它会删除并重新创建它。

    您可能注意到,这chown仅适用于sudo,因为普通用户无法更改文件所有权 - 只有 root 才允许这样做。(sudoer 与 root 不同。)

    这同样适用于 rsync;如果它以接收端的普通非 root 用户身份运行,它将无法恢复原始文件所有权,并且它创建的所有文件将始终归同一用户所有。

  • 在第二种情况下,两个文件的时间戳通常在同一秒内,因此 rsync 认为 file2 是“最新的”并且根本不会对其进行修改。

    查看选项——如果您希望精确比较时间戳,则--modify-window可以将其设置为,然后在两种情况下都会重新创建文件。-1

相关内容