Linux rsync 同步目录如何排除文件并保留权限?安全命令配方
在 Linux 服务器之间同步发布目录、备份目录或静态资源时,rsync 比普通复制更适合长期使用:它可以只传变化的文件,也能保留权限、时间、软链接等属性。真正容易出错的地方不在命令能不能跑,而在有没有先预览、排除规则是否命中、源路径尾部斜杠是否符合预期,以及 `--delete` 会不会把目标目录里不该删的文件清掉。
- 同步前先加
--dry-run预览文件列表,确认排除规则和目标路径都正确。 - 常规目录同步优先使用
-a,它等价于一组归档参数,适合保留权限、时间、软链接、属主属组等信息。 - 排除缓存、日志、临时文件用
--exclude或--exclude-from,复杂规则建议放进单独文件。 --delete会删除目标目录中源端没有的多余文件,必须和源路径尾部斜杠一起核对。
- 同步目录时先明确目标
- 最小可用命令:先预览再同步
- 关键参数怎么理解
- 排除规则的几种常用写法
- 尾部斜杠和 delete 的风险
- 完整脚本示例
- 相关问题
- 总结
同步目录时先明确目标
假设线上目录是 /srv/app/current/,备份目录是 /data/backup/app/,我们希望保留文件权限和修改时间,但不想把缓存、运行日志、临时上传文件一起带过去。这类任务很常见:发布前备份、服务器迁移、静态站同步、对象存储前的本地归档,都可以用同一套思路处理。
rsync 官方手册把它描述为一个快速、灵活的本地和远端复制工具,支持用远端 shell 传输,也支持本机目录之间同步。手册同时说明,rsync 支持复制软链接、设备、属主、属组和权限,也提供类似 tar 的排除规则。换句话说,它不是只会“复制文件”,而是能把目录结构、文件属性和传输范围一起控制住。
最小可用命令:先预览再同步
第一次写同步命令时,不建议直接运行最终命令。更稳的做法是先用 --dry-run 看结果,再把同一条命令去掉预览参数用于正式同步。
rsync -av --dry-run \ --exclude='cache/' \ --exclude='*.log' \ /srv/app/current/ \ /data/backup/app/
确认输出里没有意外的大目录、日志文件或错误目标后,再执行同步:
rsync -av \ --exclude='cache/' \ --exclude='*.log' \ /srv/app/current/ \ /data/backup/app/

这里的 -v 只是为了让输出更清楚,脚本长期运行时可以按需要减少输出。核心是 -a、--dry-run、--exclude 和源目标路径。
关键参数怎么理解
rsync 参数很多,日常目录同步不用一次记完。先掌握下面几个,已经能覆盖大多数发布和备份场景。
| 参数 | 作用 | 使用建议 |
|---|---|---|
-a |
归档模式,官方手册列出它等价于 -rlptgoD |
目录备份、迁移、发布目录同步优先使用 |
-v |
显示同步过程 | 手工执行时保留,定时脚本可结合日志控制输出 |
--dry-run |
只预演,不改动目标目录 | 新命令、带 delete 的命令、规则变更前先跑一次 |
--exclude |
排除匹配的文件或目录 | 适合少量规则,例如缓存目录、日志后缀 |
--exclude-from |
从文件读取排除规则 | 适合团队固定规则,方便审查和复用 |
--delete |
删除目标目录里源端没有的多余文件 | 只在镜像同步时使用,必须先预览 |
需要注意的是,-a 并不等于“完全保留所有扩展属性”。如果你的环境依赖 ACL 或扩展属性,还要按系统能力和业务需求评估 -A、-X 等参数。普通 Web 发布目录通常先从 -a 开始,再根据权限模型补充。
排除规则的几种常用写法
少量排除规则可以直接写在命令里:
rsync -av --dry-run \ --exclude='cache/' \ --exclude='runtime/' \ --exclude='*.log' \ --exclude='tmp/*.sock' \ /srv/app/current/ /data/backup/app/
规则多了以后,建议放进一个单独文件,例如 /etc/rsync-app.exclude:
cache/ runtime/ *.log tmp/*.sock uploads/temp/
命令就可以简化为:
rsync -av --dry-run \ --exclude-from=/etc/rsync-app.exclude \ /srv/app/current/ /data/backup/app/
排除规则最好跟业务目录一起维护。比如 uploads/ 里既有用户文件又有临时文件,不要粗暴排除整个上传目录,而是把 uploads/temp/、uploads/cache/ 这类临时路径单独列出来。
尾部斜杠和 delete 的风险
rsync 的源路径尾部斜杠非常关键。官方手册说明,源目录带尾部斜杠时,语义更接近“复制目录里的内容”;不带尾部斜杠时,更接近“复制这个目录本身”。两个命令看起来只差一个 /,目标目录结构可能完全不同。
# 把 current 目录里的内容同步到 backup/app/ rsync -av /srv/app/current/ /data/backup/app/ # 把 current 这个目录同步到 backup/app/current rsync -av /srv/app/current /data/backup/app/

如果再叠加 --delete,风险会放大。它适合“目标目录必须和源端保持镜像一致”的场景,不适合混放人工文件、临时验证文件或其他服务生成文件的目录。第一次使用时建议先这样看变更:
rsync -av --dry-run --delete \ --exclude-from=/etc/rsync-app.exclude \ /srv/app/current/ /data/backup/app/
预览输出确认无误后,再去掉 --dry-run。如果目标目录里有不能删的手工文件,最好调整目录结构,不要依赖“记得不要删”这种人工约定。
完整脚本示例
下面是一个更适合放到运维仓库里的脚本。它把源目录、目标目录、排除文件都显式写出来,并默认先预览。确认无误后,把 DRY_RUN=1 改成 DRY_RUN=0 即可正式同步。
#!/usr/bin/env bash
set -euo pipefail
SRC="/srv/app/current/"
DEST="/data/backup/app/"
EXCLUDE_FILE="/etc/rsync-app.exclude"
DRY_RUN="${DRY_RUN:-1}"
args=(
-av
--exclude-from="$EXCLUDE_FILE"
)
if [ "$DRY_RUN" = "1" ]; then
args+=(--dry-run)
fi
rsync "${args[@]}" "$SRC" "$DEST"
如果目标是远端服务器,路径可以换成 SSH 形式:
rsync -av --dry-run \ --exclude-from=/etc/rsync-app.exclude \ /srv/app/current/ \ deploy@192.168.10.20:/data/backup/app/
公网或跨机房同步时,还可以加 --bwlimit=RATE 限制带宽,避免同步任务把业务链路打满。限速值要结合网络环境测试,不要直接照搬。
相关问题
rsync 的 -a 会保留权限吗?
会。官方手册列出的 -a 包含 -p,也就是保留权限;同时还包含递归、软链接、时间、属主、属组、设备文件等归档相关能力。普通用户同步到无权限修改属主的目标时,属主属组能否保留还取决于系统权限。
rsync 排除目录时为什么建议写 cache/ 而不是 cache?
cache/ 明确表达目录意图,更不容易误伤同名文件。团队规则文件里建议把目录排除写成带斜杠的形式,让审查的人一眼看懂。
什么时候应该使用 --delete?
只有当目标目录要严格镜像源目录时才建议使用,例如静态站全量发布、只读备份目录刷新。只要目标目录还混有人工文件、服务生成文件或其他系统共用文件,就要谨慎。
rsync 同步后权限不符合预期怎么办?
先确认是否用了 -a 或 -p,再看目标端用户是否有权限设置属主属组。若只希望统一新文件权限,可以结合 --chmod 做约束,但要先在测试目录预览和验证。
总结
rsync 同步目录的安全配方可以记成四步:先用 --dry-run 看变化,再用 -a 保留目录属性,用 --exclude 或 --exclude-from 控制同步范围,最后单独核对源路径尾部斜杠和 --delete。这套流程比记一条复杂命令更可靠,尤其适合发布、备份和服务器迁移这种出错成本较高的场景。
Go channel 缓冲区是不是越大越好?容量要按吞吐和延迟定
- 上一篇
- Go channel 缓冲区是不是越大越好?容量要按吞吐和延迟定
- 下一篇
- MySQL 多租户订单表架构演进:从 tenant_id 联合索引到租户分片
-
- 文章 · linux | 1天前 | Linux · 服务治理 · 日志排查 · 运维教程 · Linux 服务管理器 journalctl 服务重启 运维排查 RestartSec start-limit-hit
- Linux 服务反复重启怎么办:journalctl 和 RestartSec 排查清单
- 408浏览 收藏
-
- 文章 · linux | 2星期前 | Linux · 运维排查 · 文件句柄 · ulimit · 服务限制 · Linux 文件句柄 lsof ulimit too many open files LimitNOFILE 服务限制
- Linux 文件句柄耗尽排查工作流:从 ulimit 到服务限制放大
- 482浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ljg-skills
- ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
- 3449次使用
-
- MELO音乐
- MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
- 3187次使用
-
- UniScribe
- UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
- 3156次使用
-
- 剧云
- 剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
- 3354次使用
-
- 万象有声
- 万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
- 3307次使用
-
- Linux系统下如何安装Mysql(centOS7以上不支持Mysql)
- 2023-01-16 100浏览
-
- 极客时间优秀课程推荐分享
- 2023-02-23 100浏览
-
- 从0到1的springboot商城
- 2023-02-16 101浏览
-
- Python 之父撰文回忆:为什么要创造 pgen 解析器?
- 2023-01-27 102浏览
-
- 如何给列表降维?sum()函数的妙用
- 2023-01-23 104浏览

