Linux rsync 怎样保留权限并排除缓存目录
来源:17golang原创
时间:2026-11-03 12:49:53 308浏览 收藏
Linux 中用 rsync 同步目录时,通常把“保留属性”和“排除缓存”拆成两个明确的选择:用 -a 作为归档模式保留递归、权限、时间、属主、属组和软链接等常见属性,再用一个或多个 --exclude 规则把缓存目录排除在传输清单之外。一个适合备份或部署的起点是:
# 以项目目录内容为同步范围,保留常见属性并跳过缓存目录 rsync -a \ --exclude='cache/' \ --exclude='.cache/' \ --exclude='__pycache__/' \ ./project/ /srv/backup/project/
官方手册地址:https://download.samba.org/pub/rsync/rsync.1
关键是不要把-a和--exclude当成同一类参数:前者决定复制哪些常见属性,后者决定哪些路径进入传输范围。若需要跨主机同步,再把目标写成 SSH 路径;若需要保留 ACL、扩展属性或真实属主,则还要结合权限和额外选项判断。
- 保留属性:优先从
-a开始,确认目标端是否允许设置属主和属组。 - 排除缓存:用带结尾斜杠的目录规则,例如
cache/和.cache/。 - 路径语义:
./project与./project/的目标目录层级不同。 - 删除边界:普通排除不会自动删除目标端已有缓存,谨慎使用
--delete-excluded。
用 -a 保留属性,再用 --exclude 缩小传输范围
rsync 手册把归档模式 -a 展开为 -rlptgoD:递归复制、保留软链接、权限、修改时间、属主、属组以及设备和特殊文件。它适合先建立一个“属性基线”,不需要把每个短选项手工拼出来。需要注意的是,归档模式不是“所有元数据都保留”,它默认不包含 ACL、扩展属性、访问时间、创建时间和硬链接等额外范围。
--exclude 只负责增加排除规则。也就是说,命令可以同时表达“保留普通文件的权限”和“不要传输缓存目录”,但两者解决的是不同问题。把缓存目录排除后,文件属性策略仍然作用于其余进入清单的文件。

用目录规则排除常见缓存
如果项目中可能出现多个层级的同名缓存目录,可以重复传入规则:
# 结尾的斜杠表示只匹配目录,不把同名普通文件当成缓存目录 rsync -a \ --exclude='cache/' \ --exclude='.cache/' \ --exclude='__pycache__/' \ ./project/ /srv/backup/project/
不以斜杠开头的模式会按传输树中的路径组件匹配,因此这些规则可以覆盖不同子目录里的同名缓存目录。如果只想排除同步根目录下的某一项,可以写成带起始斜杠的模式,例如 --exclude='/build-cache/';规则中的起始位置是 rsync 的传输根,不一定等于文件系统的根目录。
规则较多时,用 --exclude-from 维护一份文本文件更容易审阅:
# excludes.txt 每行写一条排除模式;注释说明规则的业务原因 cat > excludes.txt
排除文件中的规则仍然受传输根和匹配语义影响。不要只凭目录名猜测结果,尤其是源路径是否带结尾斜杠发生变化时,带起始斜杠的规则也要一起调整。
比较本地目录和 SSH 远端同步方式
本地目标与远端 SSH 目标可以使用同一套属性和排除规则,主要变化在目标写法:
# 本地同步:源目录结尾的斜杠表示同步目录内容 rsync -a --exclude='cache/' ./project/ /srv/backup/project/ # SSH 推送:远端用户需要有目标目录的写入权限 rsync -a --exclude='cache/' ./project/ backup@backup-host:/srv/backup/project/ # 先观察会进入传输清单的变化,不修改目标端 rsync -an --itemize-changes --exclude='cache/' ./project/ backup@backup-host:/srv/backup/project/
源路径写成 ./project 时,目标通常会得到一个名为 project 的目录;写成 ./project/ 时,表达的是把其内容放入目标目录。做备份和部署时,建议把这个选择写进脚本注释,避免目标端多一层或少一层目录。
远端使用单冒号路径时,rsync 通常通过 SSH 或指定的远程 shell 启动对端 rsync。远端也必须安装 rsync。-n 是 dry-run,只展示计划变化;它适合在首次加入排除规则或目标路径变更时人工查看,但不替代真实权限与业务验收。

按属性需求选择补充参数
-a 能覆盖常见的 Unix 文件属性,但并不意味着非 root 用户可以把源端属主原样写入目标端。属主和属组的设置受目标端权限、账号映射和运行方式影响;即使文件内容同步成功,也不能据此断言属主已经完全一致。
| 需求 | 起点选择 | 需要确认的边界 |
|---|---|---|
| 普通项目备份 | -a 加目录排除 | 目标用户需要写入目录,属主是否可保留要另行确认 |
| 保留 ACL | -aA | 源、目标文件系统和运行用户都要支持并允许设置 ACL |
| 保留扩展属性 | -aX | 目标端文件系统和权限必须支持 xattr |
| 缓存不复制但目标已有缓存保留 | --exclude='cache/' | 不要无意加入 --delete-excluded |
如果脚本要维护“目标端严格镜像”,才需要进一步讨论 --delete。rsync 默认不会删除被排除的目标文件;加入 --delete-excluded 后,缓存目录可能成为删除范围的一部分。此类命令应先用 -n 看清删除清单,并把删除策略与普通同步命令分开审阅。
常见问题与选择结论
只加 --exclude,不加 -a,可以保留权限吗?
不建议这样理解。--exclude 只改变路径过滤,是否递归和保留权限要由其他选项决定。以目录备份为目标时,通常从 -a 开始,再叠加排除规则。
为什么排除了 cache,目标端原来的 cache 还在?
排除表示不参与本次传输,默认也保护目标端被排除的文件不被删除。只有明确使用删除相关选项,才会改变这一边界;生产脚本不要把“没有复制”误认为“已经清理”。
需要保留权限时一定要用 root 吗?
不一定。普通文件的权限和内容可以在允许的范围内同步,但属主、属组、设备文件和特殊属性可能需要更高权限或额外配置。应把“文件能读写”和“元数据完全一致”分成两个验收目标。
cache/ 和 /cache/ 有什么区别?
cache/ 面向传输树中匹配到的目录名;以斜杠开头的模式锚定到传输根下的路径。源路径带不带结尾斜杠会改变传输根的形状,因此规则也应跟着目标结构一起复核。
最终可以按这个决策顺序选择:先用 -a 明确属性基线,再用 --exclude 或 --exclude-from 明确缓存范围,接着确认源路径斜杠和本地/SSH 目标,最后才决定是否需要 ACL、xattr 或删除策略。这样既能减少缓存传输,也不容易把排除目录、权限保留和目标清理混为一谈。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
166 收藏
-
148 收藏
-
432 收藏
-
227 收藏
-
383 收藏
-
285 收藏
-
413 收藏
-
437 收藏
-
247 收藏
-
157 收藏
-
263 收藏
-
391 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习