根据我的理解,rsync
没有-o
and-g
选项意味着在不更改目标所有者和组的情况下进行复制。但是,我发现了一种rsync
我无法解释的非常奇怪的行为。一个例子总是比冗长的解释好:
设file1
和file2
为 2 个文件,其组和所有者分别为 user1:user1 和 user2:user2。
运行以下指令(在 2 行中)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
。
也许我错过了什么,但我找不到什么。请问您有什么解释吗?
先感谢您。
默认情况下,rsync 以 1 秒的精度比较时间戳(尽管它以尽可能高的精度传输它们)。因此:
在第一种情况下,rsync 认为 file2 “过时”(由于时间戳与源不同),因此它删除并重新创建它。
您可能注意到了
chown
only 适用于sudo
,因为普通用户无法更改文件所有权 - 只有 root 可以这样做。(成为 sudoer 与成为 root 不同。)这同样适用于 rsync;如果它在接收端以普通非 root 用户身份运行,它将无法恢复原始文件所有权,并且它创建的所有文件将始终归同一用户所有。
在第二种情况下,两个文件的时间戳都在同一秒内(通常),因此 rsync 认为 file2 “最新”并且根本不修改它。
查看
--modify-window
选项 --1
如果您想要精确比较时间戳,您可以将其设置为,然后在两种情况下都将重新创建文件。我相信你误解了
rsync
. 这是-o
和-g
选项根据rsync
手册页所做的:因为您在
rsync
本地运行,所以您是接收方的调用用户。如果我正确理解手册页,则没有选项可以保留目标文件的所有者和组,只有源文件的所有者和组(通过使用-o
and-g
选项) - 所以你看到的行为是正常的。