如何只同步新文件

sup*_*rio 207 rsync

我正在尝试通过将新生成的文件添加到远程服务器来设置 rsync 以将我的主 Web 服务器同步到远程服务器。

这是我使用的命令:

rsync -avh --update -e "ssh -i /path/to/thishost-rsync-key" remoteuser@remotehost:/foo/bar /foo/bar
Run Code Online (Sandbox Code Playgroud)

但似乎网络服务器实际上传输了所有文件,尽管有“--update”标志。我尝试了不同的标志组合(例如省略“-a”并使用“-uv”),但没有任何帮助。如何修改 rsync 命令以仅发送新添加的文件?

Chr*_*own 252

来自man rsync

--ignore-existing       skip updating files that exist on receiver
Run Code Online (Sandbox Code Playgroud)

--update做了一些稍微不同的事情,这可能就是为什么您会得到意想不到的结果(请参阅 参考资料man rsync):

这会强制 rsync 跳过目标上存在且修改时间比源文件更新的任何文件。(如果现有目标文件的修改时间与源文件的修改时间相同,则如果大小不同,它将被更新。)

  • 手册页很糟糕(我去了那里是对的),举个例子,`--ignore-existing` 是否意味着不传输接收器上存在的文件,或者如果存在某些具有相同名称的文件/文件夹,则不传输文件在接收器上? (17认同)
  • --update *does* 当 mtimes 相同时跳过文件(这不是*措辞所暗示的)。我测试了这个。我相信如果它说“只会复制比目标更新的源文件”,会更好地理解该措辞。 (8认同)
  • @Octopus“只会复制比目标文件新的源文件”**...或者与目标文件对应的修改时间相同但大小不同的源文件**。我认为这是很重要的一点。(克里斯已经介绍过了,谢谢) (5认同)
  • 好吧,实际上我尝试使用“--ignore-existing”而不是“--update”来执行命令。它完成得很快,但不会将新文件放入远程主机。有任何想法吗?谢谢 (2认同)

t0r*_*r0X 57

就我而言,我遇到了类似的问题,传输了所有文件,而不仅仅是修改后的/新文件。我通过使用参数-t(而不是-a)和-P(相当于--partial --progress)解决了这个问题:

rsync -h -v -r -P -t 目标

这仅传输新文件和已存在但已修改的文件:-a做太多,如用户和组 ID 同步,在我的情况下无法工作,因为我的源和目标系统上有不同的用户和组。

详细参数:

  • -h: 人类可读的数字
  • -v: 冗长
  • -r: 递归到目录
  • -P:(--partial保留部分传输的文件)+
            --progress(传输过程中显示进度)
  • -t: 保留修改时间

  • +1 表示“-a 做得太多”(确实是“-rlptgoD”,因此权限不会变平,组和所有者被保留——不是我典型的安全备份......) (4认同)
  • 为我工作。为了方便起见,我更喜欢输入“rsync -hvrPt”。 (2认同)