首页
  • 上位机
  • 嵌入式
  • AI
  • Web
教程
MarkDown语法
有趣的项目
其他
GitHub
首页
  • 上位机
  • 嵌入式
  • AI
  • Web
教程
MarkDown语法
有趣的项目
其他
GitHub
  • rsync 命令详解与示例

rsync 命令详解与示例

一、rsync 命令核心功能与基本语法

1. 核心功能

  • 增量同步:仅传输源文件与目标文件之间的差异部分,大幅减少数据传输量。
  • 跨平台支持:适用于本地文件系统、远程 SSH 或 rsync 协议连接的服务器。
  • 元数据保留:支持保留文件权限、时间戳、符号链接、硬链接等属性。
  • 灵活过滤:可通过正则表达式、排除/包含规则筛选同步文件。
  • 传输优化:支持压缩(-z)、带宽限制(--bwlimit)、断点续传(需配合工具)等。

2. 基本语法

# 本地同步语法
rsync [选项] [源路径] [目标路径]

# 远程同步语法(通过 SSH 协议)
rsync [选项] [源路径] [用户@]远程主机:[目标路径]
rsync [选项] [用户@]远程主机:[源路径] [目标路径]

# 远程同步语法(通过 rsync 守护进程协议)
rsync [选项] rsync://远程主机模块名/[目标路径]

核心参数分类:

  • 模式参数:
    • -a(归档模式,等价于 -rlptgoD,保留所有元数据并递归同步)
    • -n/--dry-run(模拟同步,不实际传输文件,用于测试)
    • -v/-vv(显示详细/更详细的同步过程)
  • 传输控制:
    • -z(压缩传输数据,提升网络传输效率)
    • --delete(删除目标中源不存在的文件,实现镜像同步)
    • --ignore-errors(忽略文件删除/读取错误,继续同步)
  • 过滤规则:
    • --exclude="模式"(排除符合模式的文件/目录)
    • --include="模式"(强制包含符合模式的文件/目录)
  • 性能优化:
    • --bwlimit=KB/s(限制传输带宽,如 --bwlimit=1024)
    • -P(等价于 --partial --progress,显示进度并保留部分传输文件)
    • -D(保留设备文件和特殊文件)

二、常用用例与命令示例

1. 本地文件同步

场景:将本地目录 /data/source 同步到 /data/backup,保留所有属性并显示详细过程。

rsync -av /data/source/ /data/backup/

注意:

  • 末尾斜杠 / 表示同步目录内的内容,目标目录不存在时会自动创建。
  • 若源路径不带斜杠(如 /data/source),目标目录会创建以 source 为名的子目录。

2. 远程同步(通过 SSH)

场景 1:本地文件上传到远程服务器

rsync -avz /local/file.txt user@remote.server:/remote/path/

-z 压缩文件,适合网络传输;远程路径需用户有权限写入。

场景 2:从远程服务器下载文件

rsync -avz user@remote.server:/remote/file.txt /local/path/

场景 3:跨服务器同步(无需本地中转)

rsync -avz -e "ssh -p 2222" user1@server1:/source/ user2@server2:/dest/

-e 指定使用 SSH 协议及端口(默认 22),支持加密传输。

3. 增量备份与镜像同步

场景 1:增量备份(仅更新变化的文件,删除目标中多余文件)

rsync -av --delete /source/ /backup/

警告:--delete 会使目标与源严格一致,谨慎用于重要数据!建议先用 --dry-run 模拟。

场景 2:保留历史版本的增量备份(使用硬链接节省空间)

rsync -av --link-dest=/backup/last/ /source/ /backup/current/

--link-dest 让新备份共享上一次备份的相同文件,仅存储差异部分。

4. 排除/包含特定文件

场景:同步目录时排除日志文件和临时文件

rsync -av --exclude="*.log" --exclude="tmp/" /data/ /backup/

支持通配符(*、?)和目录路径(如 tmp/ 表示排除整个目录)。
复杂过滤可使用 --exclude-from=文件,在文件中每行写一个排除模式:

rsync -av --exclude-from=exclude.list /source/ /dest/

5. 性能优化与高级选项

  • 限速传输(避免影响带宽):
    rsync -avz --bwlimit=2048 /large_data/ remote:/storage/
    
  • 校验和模式(跳过时间戳检查,确保文件内容一致):
    rsync -av --checksum /source/ /dest/
    
  • 保留符号链接(默认保留,若需跟随链接同步实际文件,加 --follow-symlinks):
    rsync -av --follow-symlinks /source/ /dest/
    

三、常见问题与解决方案

1. 权限问题:rsync: failed to open dir: Permission denied

  • 原因:源/目标目录无读取/写入权限,或远程用户权限不足。
  • 解决:
    • 本地同步:使用 sudo 提升权限,或确保用户对路径有对应权限。
    • 远程同步:检查远程用户是否为目录所有者,或使用 ssh-keygen 配置无密码登录避免权限中断。

2. 误删文件:--delete 意外删除目标文件

  • 预防:
    • 永远先用 --dry-run 模拟同步:
      rsync -av --delete --dry-run /source/ /dest/
      
    • 重要数据先备份目标目录,或使用 --delete-after(先传输新文件再删除,减少风险)。

3. 传输中断:网络不稳定导致同步失败

  • 解决:
    • 使用 -P(--partial)保留未完成传输的临时文件,支持断点续传:
      rsync -avP /large_file.iso remote:/dest/
      
    • 若频繁中断,可搭配 rsync + nohup 或 screen 保持会话持续。

4. 文件冲突:源与目标有同名但内容不同的文件

  • 现象:rsync 默认以源文件覆盖目标文件,可能导致数据丢失。
  • 解决:
    • 使用 --compare-dest=参考目录 对比三方文件(需 rsync >= 3.1.0):
      rsync -av --compare-dest=/reference/ /source/ /dest/
      
    • 手动检查冲突文件(通过 --itemize-changes 输出详细差异):
      rsync -av --itemize-changes /source/ /dest/
      

5. 符号链接异常:同步后链接失效或指向错误

  • 原因:默认 rsync 保留符号链接本身,不跟随其指向的文件。
  • 解决:
    • 若需保留链接(推荐):无需额外参数,默认行为正确。
    • 若需同步链接指向的实际文件:添加 --follow-symlinks,但可能导致循环链接错误。

四、最佳实践总结

  1. 测试优先:复杂同步任务先用 --dry-run 模拟,确认输出无误后再执行。
  2. 备份关键数据:对重要目录同步前,手动备份目标数据(尤其是含 --delete 的操作)。
  3. 日志记录:通过 --log-file=rsync.log 记录同步过程:
    rsync -av --delete --log-file=sync.log /source/ /dest/
    
  4. 版本控制:结合 --link-dest 实现基于硬链接的版本化备份,节省存储空间。

提示:根据具体场景调整参数,必要时查阅官方文档(man rsync)获取完整选项说明。