rsync --ignore-times/-I选项行为不符合预期的问题求助
问题分析:rsync -I/--ignore-times 为何同步全部文件
首先纠正一个认知偏差:--ignore-times(或-I)的作用不是仅同步时间戳和大小相同但内容不同的文件,而是完全跳过「时间戳+文件大小」的快速校验逻辑,强制对所有文件进行内容校验(通过校验和比对),只要源文件与目标文件存在差异(包括内容、时间戳),就会同步。
你的测试脚本与输出解析
在你的测试场景中,使用-I时每次rsync都同步所有文件,核心原因是:
- 对于
notupdated这类内容未修改的文件:源文件的时间戳被固定为constantDate的时间,而目标文件的时间戳是第一次rsync时的系统时间(晚于constantDate)。当使用-I时,rsync跳过时间+大小的快速检查,直接比对内容(内容相同),但默认会同步源文件的时间戳到目标,所以会触发时间戳更新,输出中显示f..T...... notupdated(T代表修改时间被同步)。 - 对于
contentsupdatedbutsamesizeanddate这类内容修改但大小、时间戳不变的文件:-I确实能检测到内容差异并同步,这符合你原本的预期,但因为其他文件的时间戳差异也会被同步,所以看起来像是全部文件都被同步了。
正确用法:仅同步「时间戳+大小相同但内容不同」的文件
如果你只想同步那些时间戳和大小都匹配,但内容不同的文件,不能用-I,而是需要结合--checksum(或-c)选项:
--checksum会先通过「时间戳+文件大小」快速筛选出可能有变化的文件;对那些时间戳和大小都相同的文件,再通过校验和比对内容,若内容不同则同步。- 而
-I是直接跳过快速筛选环节,对所有文件都做内容校验,无论时间和大小是否匹配。
验证调整
把你的脚本中OPT="-r -iI"改成OPT="-r -ic",重新运行测试:
Updated2阶段只会同步contentsupdatedbutsamesizeanddate文件,其他文件因为时间戳/大小匹配且内容相同,不会被同步。
内容的提问来源于stack exchange,提问作者framp
相关产品推荐
相关产品推荐

