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