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

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 归档属性策略与缓存排除范围的静态结构图
图1:静态说明图,展示 -a 的属性范围与 --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,只展示计划变化;它适合在首次加入排除规则或目标路径变更时人工查看,但不替代真实权限与业务验收。

rsync 源目录、SSH 目标与缓存排除模式的静态关系图
图2:静态说明图,展示源目录斜杠语义、SSH 目标和三个缓存目录规则之间的边界关系。

按属性需求选择补充参数

-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 或删除策略。这样既能减少缓存传输,也不容易把排除目录、权限保留和目标清理混为一谈。

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