You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 09:33:04