如何仅同步新文件

如何仅同步新文件

我正在尝试设置 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

答案4

请注意rsync --ignore-existing -raz --progress /var/www/88021064/var[电子邮件受保护]:/usr/home/xxx/public_html/var/ 不会不做任何事情,它对我有用的方式是 rsync --ignore-existing -raz --progress /var/www/88021064**/var/***[电子邮件受保护]:/usr/home/xxx/public_html/var/,注意不会更新 hideen 文件,因为 hideen 文件只多执行一次 /var/www/88021064/var/.[^.]*

相关内容