rsync组合-t与--ignore-existing参数时不符合预期的问题及实现需求的方法咨询
rsync组合-t与--ignore-existing参数时不符合预期的问题及实现需求的方法咨询
嗨,我太懂你这个困惑了!本来想着-t(保留文件修改时间)加--ignore-existing(跳过目标已存在的文件)正好完美匹配你的需求——只把目标没有的文件传过去,还保留原时间,已存在的文件不管时间戳差多少都不动,但结果dry-run的输出完全不对,对吧?
先给你解释为啥会这样
rsync的--ignore-existing确实是用来跳过目标已存在的文件,但它的“跳过”默认只针对文件内容的更新;而当你加上-t参数后,rsync会额外检查所有文件(包括目标已存在的)的修改时间。如果源文件和目标文件的时间戳不一致,rsync会认为需要更新目标文件的时间戳——这个操作是不受--ignore-existing限制的,所以dry-run里会把这些已存在的文件列出来,看起来像是要处理它们,但实际上它只是准备更新时间戳(当然这也不符合你完全不碰已存在文件的需求)。
你试的--size-only没用,是因为它只是改变了rsync判断“是否需要更新”的条件(只看大小不看时间),但依然会触发对已存在文件的检查逻辑,所以还是会出现那些多余的输出。
给你两个靠谱的解决办法
方法一:用find筛选文件后同步(最精准)
先在源目录里找出所有目标目录不存在的文件,生成一个列表,再用rsync同步这个列表里的文件,同时保留时间戳:
# 进入源目录,生成需要同步的文件列表 cd dir1 find . -type f -exec test ! -f "../dir2/{}" \; -print > need_sync.txt # 用rsync同步列表里的文件,保留修改时间 rsync -rlvt --files-from=need_sync.txt dir1/ dir2/
这个方法能精准命中你要的效果:只传目标没有的文件,保留原时间,已存在的文件完全不会被触碰。
方法二:用rsync的过滤规则实现
如果你不想单独生成文件列表,可以用rsync的过滤规则来间接实现“只同步目标不存在的文件”:
rsync -rlvt --filter='merge /dev/fd/0' dir1/ dir2/ << EOF - */ + * - existing EOF
不过这个方法依赖rsync的过滤逻辑,不如方法一直观好理解,新手更推荐用第一种。
备注:内容来源于stack exchange,提问作者Etua
相关产品推荐
相关产品推荐

