当前位置:首页 > 文章列表 > 文章 > linux > Linux rsync 同步目录如何排除文件并保留权限?安全命令配方

Linux rsync 同步目录如何排除文件并保留权限?安全命令配方

来源:17golang原创 2026-07-02 13:20:46 0浏览 收藏

在 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/

Linux rsync 使用 dry-run 预览、exclude 排除缓存日志并用 -a archive 保留权限的同步流程图

这里的 -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/

Linux rsync 源路径 src 目录尾部斜杠与 --delete 删除风险的对比检查图

如果再叠加 --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。这套流程比记一条复杂命令更可靠,尤其适合发布、备份和服务器迁移这种出错成本较高的场景。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Go channel 缓冲区是不是越大越好?容量要按吞吐和延迟定Go channel 缓冲区是不是越大越好?容量要按吞吐和延迟定
上一篇
Go channel 缓冲区是不是越大越好?容量要按吞吐和延迟定
MySQL 多租户订单表架构演进:从 tenant_id 联合索引到租户分片
下一篇
MySQL 多租户订单表架构演进:从 tenant_id 联合索引到租户分片
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ljg-skills -
    ljg-skills
    ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
    3449次使用
  • MELO音乐 - AI 音乐生成平台,支持多模态创作能力
    MELO音乐
    MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
    3187次使用
  • UniScribe - AI 免费在线音视频转文字平台
    UniScribe
    UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
    3156次使用
  • 剧云 - 免费 AI 智能中文剧本创作平台
    剧云
    剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
    3354次使用
  • 万象有声 - AI 一站式有声内容创作平台
    万象有声
    万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
    3307次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码