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

Linux rsync 怎样只同步变化文件并保留权限

来源:17golang原创

时间:2026-10-23 10:30:50 415浏览 收藏

Linux 上想“只同步变化文件并保留权限”,最小写法通常是 rsync -a 源目录/ 目标目录/。rsync 默认用文件大小和最后修改时间做 quick check,判断不需要更新的文件会跳过数据传输;-a 是归档模式,包含递归、权限、时间、属主、组等基础属性的保留。这里的“只同步变化”不是只比较文件内容,而是先用快速属性判断,再对需要更新的文件使用增量传输。

目录同步的关键只有两件事:用 -a 保留权限等属性,用源目录尾部的 / 明确同步“目录内容”而不是再套一层同名目录。

官方地址:https://download.samba.org/pub/rsync/rsync.1

先把同步接口的两个目标分开

rsync 的调用方目标可以拆成“数据选择”和“属性处理”。数据选择由 quick check 负责:默认关注文件大小和修改时间,属性看起来没有变化时,文件数据通常不必重新发送。对于确实需要传输的文件,rsync 还会用 delta-transfer 算法减少网络上重复的数据。

权限保留则由参数决定。归档模式 -a 等价于一组常用选项,包含 -r 递归目录、-l 保留符号链接、-p 保留权限、-t 保留修改时间、-g 保留组、-o 保留属主以及设备文件相关选项。它适合目录镜像的默认场景,但不代表普通用户一定有权在目标端写入属主或组。

用 -a 写出最小的变化同步命令

本地目录同步可以这样写。命令里的中文注释说明参数职责,示例本身不会把本机路径当成固定配置。

# 只把 source 目录的内容同步到 backup,保留递归、权限和时间
rsync -a source/ backup/

# -v 只增加可读的传输信息;尾部 / 表示同步 source 的内容
rsync -av source/ backup/

如果把源路径写成 source 而不是 source/,目标端通常会出现 backup/source 这一层;写成 source/ 则把其中的内容放进已有目标目录。这个差异不是性能优化,而是路径语义。

rsync quick check、增量传输、归档模式和目标目录之间关系的浅色工程蓝图说明图
图1:结构说明图,查看 rsync 的 quick check、变化数据、-a 属性保留与目标目录之间的静态关系;这是说明图,不是运行截图。

用预览和校验参数控制调用方体验

正式同步前,可以先用 --dry-run 看 rsync 计划处理哪些对象,再用 -i 显示变更摘要。下面的组合不会真正写入目标目录,适合先确认尾斜杠和权限选项是否符合预期。

# 只预览变化项;-i 显示每个对象的变更摘要,不写入目标
rsync -avni source/ backup/

# 需要按文件内容比较时才启用 -c;它会读取两端文件内容,成本高于默认 quick check
rsync -avci source/ backup/

--checksum(短写法 -c)适合两端修改时间不可信、但必须按内容判断的情况。它不等于“每次都重新传输全部文件”:它改变的是传输前的判断依据,但会增加读取和计算成本。普通备份任务优先使用默认 quick check,并让源端的修改时间在写入或构建环节保持可靠。

rsync 源目录尾斜杠、归档模式、权限属性和目标目录边界的关系说明图
图2:关系说明图,查看源目录内容语义、归档属性集合和目标权限边界的对应关系;这是静态说明图,不是命令运行证据。

远程同步时处理权限、传输和兼容边界

通过 SSH 传到另一台 Linux 主机时,路径使用单个冒号,rsync 通常通过 SSH 建立远程 shell。两端都要安装 rsync,目标登录用户还要对目标目录有写权限。

# 通过 SSH 把源目录内容同步到远程目录,并保留可保留的属性
rsync -av source/ deploy@example.com:/srv/app/

# 先用预览确认远程路径和权限变化,再进行正式同步
rsync -avni source/ deploy@example.com:/srv/app/

如果目标用户不是 root,-a 中的属主和组不一定能够原样落地;权限和时间也会受目标文件系统、挂载选项以及 umask 影响。可以先把要求收窄为 -rltp,明确保留递归、链接、时间和权限,避免把“保留属主”误当成普通用户一定能完成的动作。

单冒号的远程 shell 传输通常经过 SSH 并加密;双冒号或 rsync:// 是 rsync daemon 语法,是否加密取决于额外的传输配置。不要把 daemon 密码直接放到命令行,脚本场景应使用权限收紧的密码文件或受控的 SSH 凭据。

相关问题

文件内容变了但 rsync 没有同步,为什么?

默认 quick check 主要看大小和修改时间。如果上游程序原地改写文件却恢复了旧时间,或者两端时钟和时间戳不可靠,快速判断可能不适合这个任务;此时可以临时使用 -c,并修正生成文件的时间戳管理。

为什么权限没有完全保留?

-a 包含权限和属主等属性,但目标登录用户需要具备相应能力;跨文件系统、ACL、扩展属性和 Windows 兼容层也可能需要额外选项,不能只看命令是否带了 -a。

日常目录同步可以先记住这条组合:-a 负责归档属性,源目录尾部的 / 负责内容语义,默认 quick check 负责快速筛选变化,-c 只在内容比较确实值得付出读取成本时使用。

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