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

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

来源:17golang原创

时间:2026-07-02 13:20:46 186浏览 收藏

在 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删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>