我正在尝试设置 rsync,通过将新生成的文件添加到远程服务器来将我的主 Web 服务器同步到远程服务器。
这是我使用的命令:
rsync -avh --update -e "ssh -i /path/to/thishost-rsync-key" remoteuser@remotehost:/foo/bar /foo/bar
但看起来网络服务器实际上传输了所有文件,尽管有“--update”标志。我尝试了不同的标志组合(例如省略“-a”并使用“-uv”),但没有任何帮助。如何修改 rsync 命令以仅发送新添加的文件?
答案1
从man rsync
:
--ignore-existing skip updating files that exist on receiver
--update
做了一些稍微不同的事情,这可能就是您得到意外结果的原因(请参阅man rsync
):
这会强制 rsync 跳过目标上存在的任何文件并且修改时间比源文件更新。 (如果现有目标文件的修改时间与源文件的修改时间相同,则如果大小不同,则会更新该文件。)
答案2
该问题可能是由源服务器和目标服务器上的不同用户/组 ID 引起的。我的情况类似,传输所有文件,而不仅仅是修改/新的文件。解决方案是使用参数-t
(而不是-a
)和-P
(相当于--partial --progress
):
rsync -h -v -r -P -t <source> <target>
或更短(感谢@Manngo);
rsync -hvrPt <source> <target>
这仅传输新文件以及已存在但已修改的文件。参数的-a
作用太多,例如用户和组 ID 同步,在我的情况下无法工作,因为我的源系统和目标系统上有不同的用户和组。因此,-a
我的所有源文件和目标文件始终被视为“不同”。
详细参数:
-h
:人类可读的数字-v
: 冗长-r
: 递归到目录-P
:--partial
(保留部分传输的文件) +
--progress
(显示传输过程中的进度)-t
:保留修改时间
答案3
您描述的问题可能是因为您缺少/
源目录的尾随。结果,rsync
会将所有文件复制两次:第一次复制到/foo/bar
,第二次复制到/foo/bar/bar
.此后它将有效地将更新复制到/foo/bar/bar
.
正确的命令应该是这样的:
rsync -avh -e "ssh -i /path/to/thishost-rsync-key" remoteuser@remotehost:/foo/bar/ /foo/bar