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

如何让rsync仅基于文件内容差异同步并更新对应文件及时间戳?

如何让rsync仅基于文件内容差异同步并更新对应文件及时间戳?

嗨,我完全懂你碰到的这个坑——git clone出来的文件不管内容有没有变,时间戳全都是最新的,导致rsync默认靠时间戳+文件大小判断的时候,会把一堆内容没变化的文件也当成需要同步的,太烦人了!

其实要让rsync只认文件内容,核心就是用-c(也就是--checksum)参数,它会让rsync计算每个文件的校验和,只有当校验和不一样(也就是内容真的变了)的时候,才会同步文件。

我来给你拆解一下正确的用法:

  1. 基础命令(推荐)
    用这条命令就够解决你的问题:

    rsync -acv src/ dest/
    

    各参数的作用:

    • -c:开启校验和模式,彻底忽略文件的修改时间和大小,只靠内容校验和判断是否需要同步
    • -a:归档模式,包含递归同步、保留文件权限/所有者等常用属性,其中的-t参数会在文件真的同步时,把源文件的时间戳同步到目标端——但放心,内容没变化的文件根本不会被碰,目标端的时间戳也不会乱改
    • -v:verbose模式,能看到具体哪些文件被同步了,方便你确认效果
  2. 如果你不想保留源文件的时间戳
    要是你希望同步后的文件用当前的系统时间作为修改时间,而不是源文件的git克隆时间,可以去掉-a里的-t属性:

    rsync -ac --no-t -v src/ dest/
    
  3. 关于你之前用-aci的困惑
    你说用-aci的时候,目标端所有文件时间戳都变了,大概率是误解了-i的输出。-i会输出rsync对每个文件的检查细节,比如f.st......只是表示它检查了这个文件的属性,但只有带箭头>f.st......的行才是真的同步了文件。如果内容没变化,rsync根本不会修改目标端的文件和时间戳,只是输出检查记录而已。

最后再提醒一句:第一次用这个命令同步的时候,因为目标端没有对应文件,所有文件都会被同步;但后续再跑的时候,不管git克隆出来的源文件时间戳怎么变,只有内容真的修改过的文件才会被同步,完美解决你的需求!

备注:内容来源于stack exchange,提问作者sparkmix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 07:08:09