登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

rsync 怎样只同步文件属性不复制内容

来源:17golang原创

时间:2026-10-24 22:49:23 128浏览 收藏

rsync 可以在判断文件内容不需要更新时,直接修改目标文件上被要求保留的属性。对于已经存在、对应普通文件大小相同且操作期间保持稳定的文件,可用 --existing --size-only 配合 -p、-t 修复权限和修改时间。但这不是绝对的“只改属性”开关:只要大小不同,--size-only 仍会允许内容传输。

如果要求无论源目标内容是否不同,都绝不能写目标内容,应使用专门的属性操作工具,而不是把 rsync 的快速检查条件当成保护锁。官方地址:https://rsync.samba.org/。下面所有命令均为待读者按实际授权使用的示例,本文没有执行文件变更或运行测试。

先判断是属性修复,还是仍需内容同步

需求选择前提或限制
稳定副本已存在且普通文件等长,只修权限与时间rsync -pt 与 size-only、existing大小不一致时仍可能复制内容
内容有差异也绝不允许内容写入chmod、chown、touch 等属性工具逐项明确要改的属性和权限
要让内容也一致正常 rsync 同步不能同时宣称不复制内容

大小相同不等于内容相同。采用 size-only 的取舍是忽略内容差异,只把大小相同的文件视为无需更新数据;它既不会校验内容一致,也不适合掩盖副本损坏。

还要区分“字节内容不变”和“文件完全不变”。修改权限、属主或时间本来就会改变文件元数据,也可能影响访问控制和后续增量任务。属性修复仍应限定目标,不要对整个系统目录套用。

等长普通文件可以怎样使用 rsync

下面刻意只给一个普通文件的例子,避免递归目录、链接和特殊文件引入额外行为。假设 source/item.dat 与 target/item.dat 都已经存在,是受信任的非符号链接普通文件,且已知等长、当前没有程序修改它们。

# 仅在已确认两端对应普通文件等长且稳定时使用。
# -p 同步权限位,-t 同步修改时间;不请求属主、属组或链接复制。
rsync -pti --existing --size-only -- source/item.dat target/item.dat

--existing 阻止创建缺失的目标文件;--size-only 改变内容更新的快速判断条件;-i 给出条目变更说明。这里的命令不是硬性禁止数据传输。若前提不成立,尤其是文件大小不同,就不要执行它来满足“只改属性”的严格要求。

也不要额外加 -I 或 --ignore-times,这会改变跳过内容更新的逻辑。--checksum 用来改变内容比较方式,不是属性专用开关;若检测出内容不同,正常同步仍可能传输数据。

若扩展到目录树,需要先处理路径对应、符号链接、文件类型和并发写入边界。源路径末尾斜杠会影响目录层级,目录本身的属性也可能被处理。单文件例子不能不加说明地推广为“任何目录树都安全”。

rsync 内容判断条件与属性更新请求的静态关系图
图1:静态结构说明图。existing 控制目标是否可新建,size-only 控制内容更新判断;两者并不构成不可写内容的保护边界。

为什么 existing 和 ignore-existing 不能混用成属性模式

--existing 的意思是跳过目标端不存在的文件,不是跳过已经存在文件的内容更新。因此仅用 rsync -a --existing,仍会更新需要传输的已有文件。

--ignore-existing 则跳过更新目标端已存在的文件。普通文件的属性修复也可能被跳过,不能将它理解为“跳过内容但保留属性更新”。两者同时出现,手册说明不会更新文件;这并不会产生一个可靠的普通文件属性同步模式。

已有目录又有自身处理规则,因此仅观察到目录权限有变化,不能反推同一命令已经修复了所有普通文件的权限。诊断时要明确对象类型,而不是只看任务是否退出。

普通属性、ACL 和扩展属性分别怎么选

不要默认把 -a 等同于所有元数据。归档模式包含一组常见保留选项,但 ACL、扩展属性与硬链接关系需要分别考虑。只需要权限和修改时间时,显式使用 -pt,比额外请求属主、设备等行为更容易限定范围。

属性rsync 选项需额外考虑
权限位-p目标文件系统与执行身份
修改时间-t精度与业务时间语义
属主、属组-o、-g接收端权限及身份映射
ACL-A两端支持与访问控制效果
扩展属性-X属性命名空间与权限

-A、-X 不是“不传内容”的保证,只是增加需要保留的属性类别。若使用远程同步,还要考虑两端 rsync 与文件系统能力,以及数字身份和名称映射是否符合预期。不要仅为消除报错就给接收端无限权限。

权限、时间、身份与扩展元数据的静态分组图
图2:静态关系说明图。不同属性类别有各自选项和权限要求,不能用“归档模式”代替完整需求定义。

严格禁止内容写入时,换成属性工具

若连大小不同的目标文件也必须原样保留其内容,就不要走 rsync 的内容更新判断。权限位可考虑 chmod 的参考模式,身份可由 chown 在授权范围内设置,时间则可单独交给 GNU touch。它们只解决各自属性,不会自动成为完整元数据镜像。

# GNU touch:仅复制参考文件的修改时间;-c 避免目标缺失时创建空文件。
# 路径应事先确认为受信任的普通文件,不用于未受控的符号链接。
touch -c -m -r source/item.dat -- target/item.dat

这个例子只改修改时间,不复制权限、属主、ACL 或扩展属性。目标缺失时 -c 不创建文件,但“不创建”也不等于证明目标已经完成属性修复。调用方仍需明确目标存在性与业务结果。

无论采用哪个工具,都不要从不受信任的来源照搬 setuid、setgid、可执行权限或安全相关扩展属性。批量处理应有受控的路径清单和权限边界,不能简单把源目录当作所有属性的权威来源。

按需求选择,而不是记住一个万能组合

为什么内容一样却仍可能传输? rsync 默认快速检查会考虑大小和修改时间,时间不同可触发更新。size-only 是放宽判断,不是验证相同内容,也不是无条件禁止传输。

能在修复时间的同时证明副本内容一致吗? 属性修复与内容一致性判断是两件事。不能从 -t 成功或内容传输量少推导出内容相同;特别是同大小不同内容会被 size-only 放过。

硬链接文件只改一个路径有影响吗? 多个硬链接名称可能指向同一个文件对象,修改权限或时间会反映到该对象上,不能假定其他名称完全不受影响。是否保持硬链接结构又是另一项需求。

可以把最终选择缩成一句话:已知等长且稳定、接受 rsync 条件判断时,用明确的属性选项;只要要求“内容绝不能被同步”,就选择专门的属性工具和受控清单。不要让一个看起来简短的参数组合承担它没有提供的保证。

参考:rsync 官方手册、GNU touch 手册。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>