Ubuntu 复制王者:rsync -av 终极指南 —— 进度可视化 + 无损同步,效率甩 cp 几条街!
在 Ubuntu 中复制文件 / 文件夹,多数人第一反应是cp命令,但面对大文件、海量文件或跨设备同步时,cp的 “全量复制”“无进度反馈”“丢失属性” 等问题会让效率大打折扣。而rsync作为 “专业级同步神器”,搭配-av参数后,不仅能实现 “无损复制 + 增量同步”,还能通过简单配置显示实时进度,成为服务器迁移、数据备份、文件同步的首选工具。下面从核心优势、基础用法、进度可视化、进阶技巧到避坑指南,全面拆解rsync -av的使用方法。
一、为什么选 rsync -av?比 cp 强在哪?
rsync 的核心优势的是 “增量同步”(仅复制变化的文件 / 内容),而-av组合是最常用的 “黄金参数”,两者结合实现 “高效 + 无损” 复制,具体优势对比:
| 特性 | rsync -av | cp 命令 |
|---|---|---|
| 复制逻辑 | 增量同步(仅传变化部分) | 全量复制(每次重传所有文件) |
| 属性保留 | 保留权限、时间戳、所有者、软链接等 | 仅保留部分属性(需额外加 - p/-d 参数) |
| 进度显示 | 支持实时进度条、速度、剩余时间 | 无原生进度反馈(需借助第三方工具) |
| 跨设备 / 远程同步 | 支持本地→远程、远程→本地(SSH 协议) | 仅支持本地复制 |
| 断点续传 | 支持(--partial 参数) | 不支持(中断后需重新复制) |
| 大文件 / 海量文件效率 | 极快(减少 IO 和带宽占用) | 较慢(重复传输未变化文件) |
其中-av参数的具体含义(新手必懂):
-a:归档模式(archive),等价于-rlptgoD,核心作用是保留所有文件属性(权限、时间戳、所有者、组、软链接、设备文件等),适合 “无损复制” 场景(如服务器迁移、系统文件备份)。-v:详细模式(verbose),输出复制过程中的文件列表,让你知道哪些文件正在被处理。
二、rsync -av 基础用法:复制文件 / 文件夹(本地 + 远程)
核心语法
# 本地复制(sudo用于权限受限的文件/目录,如系统文件、其他用户目录)
sudo rsync -av [--progress] 源路径 目标路径# 远程复制(借助SSH协议,本地→远程/远程→本地)
sudo rsync -av [--progress] 本地路径 用户名@远程IP:远程路径
sudo rsync -av [--progress] 用户名@远程IP:远程路径 本地路径
关键注意:源路径末尾的 “/” 区别(新手最易踩坑)
- 源路径不加 “/”:复制 “文件夹本身” 到目标目录(含文件夹名称)。
- 源路径加 “/”:复制 “文件夹内的所有内容” 到目标目录(不含文件夹名称)。
场景 1:本地复制文件
需求:复制/home/user/data/file.tar.gz到/mnt/backup(保留文件属性)
# 基础用法(显示详细文件列表)
sudo rsync -av /home/user/data/file.tar.gz /mnt/backup# 带进度显示(推荐)
sudo rsync -av --progress /home/user/data/file.tar.gz /mnt/backup
- 输出效果:会显示文件名称、大小、复制速度,进度条实时刷新。
场景 2:本地复制文件夹(最常用)
需求 1:复制/home/user/docs文件夹(含文件夹本身)到/mnt/backup
sudo rsync -av --progress /home/user/docs /mnt/backup
# 结果:目标目录下生成 /mnt/backup/docs(完整保留原文件夹)
需求 2:复制/home/user/docs内的所有内容到/mnt/backup(不含 docs 文件夹)
sudo rsync -av --progress /home/user/docs/ /mnt/backup
# 结果:docs内的文件/子文件夹直接复制到 /mnt/backup 下
场景 3:远程复制(本地→远程服务器)
需求:将本地/data/server文件夹同步到远程服务器(IP:192.168.1.100)的/opt/data目录
# 远程服务器需开启SSH服务,且本地有远程服务器的sudo权限
sudo rsync -av --progress /data/server/ ubuntu@192.168.1.100:/opt/data
- 提示:若远程 SSH 端口不是默认 22(如 2222),需加
-e "ssh -p 2222"参数:sudo rsync -av --progress -e "ssh -p 2222" /data/server/ ubuntu@192.168.1.100:/opt/data
场景 4:远程拉取(远程服务器→本地)
需求:将远程服务器的/opt/backup文件夹拉取到本地/home/user/remote_backup
sudo rsync -av --progress ubuntu@192.168.1.100:/opt/backup /home/user/remote_backup
三、重点:如何显示复制进度?两种实用方案
rsync 默认不显示进度条(仅-v参数显示文件列表),需通过额外参数实现 “实时进度可视化”,推荐两种方案:
方案 1:基础进度(--progress 参数)—— 适合单文件 / 少量文件
在-av后添加--progress,会显示每个文件的复制进度(已复制大小、速度、剩余时间):
sudo rsync -av --progress /home/user/large_file.iso /mnt/backup
- 输出效果示例:
含义:已复制 1.23GB,完成 50%,当前速度 100MB/s,剩余 6 秒。large_file.iso1.23G 50% 100MB/s 00:06
方案 2:整体进度(--info=progress2 参数)—— 适合大量文件 / 文件夹
--progress会显示单个文件的进度,若复制上千个小文件,进度条会频繁切换,此时用--info=progress2显示整体进度(总复制大小、总进度、平均速度):
sudo rsync -av --info=progress2 /home/user/docs/ /mnt/backup
- 输出效果示例:
含义:总需复制 3.45GB,已完成 78%,平均速度 85MB/s,剩余 9 秒,已传输 123 个文件,待检查 45 个文件(共 168 个)。3.45G 78% 85MB/s 00:09 (xfr#123, to-chk=45/168)
方案 3:进度条美化(搭配 pv 工具)—— 进阶需求
若想获得更美观的进度条(如百分比 + 时间轴),可安装pv工具(管道查看器):
# 安装pv
sudo apt install pv# 用法:通过管道传递rsync输出,显示整体进度
sudo rsync -av --progress /home/user/docs/ /mnt/backup | pv -lep -s $(du -sb /home/user/docs | awk '{print $1}')
- 效果:显示平滑的进度条、传输速度、剩余时间,适合追求可视化体验的用户。
四、rsync -av 进阶技巧:提升效率 + 灵活控制
1. 排除指定文件 / 文件夹(--exclude 参数)
复制时跳过不需要的文件(如日志、缓存、临时文件):
# 排除单个文件
sudo rsync -av --progress --exclude="*.log" /home/user/docs /mnt/backup# 排除多个文件/文件夹(用多个--exclude)
sudo rsync -av --progress \--exclude="*.log" \--exclude="temp/" \--exclude="node_modules/" \/home/user/docs /mnt/backup
2. 断点续传(--partial 参数)
复制大文件时中断(如网络断开、服务器重启),再次运行时无需重新复制,直接续传:
sudo rsync -av --progress --partial /home/user/large_file.iso /mnt/backup
- 建议:将
--partial加入日常命令,避免大文件复制中断后返工。
3. 压缩传输(-z 参数)—— 适合远程同步 / 低带宽场景
传输时压缩文件,减少网络带宽占用(本地复制无需加,反而会增加 CPU 开销):
# 远程同步时加-z,本地复制不加
sudo rsync -avz --progress /data/server/ ubuntu@192.168.1.100:/opt/data
4. 测试复制(--dry-run 参数)—— 避免误操作
先模拟复制过程,不实际传输文件,验证源路径、目标路径、排除规则是否正确:
sudo rsync -av --progress --dry-run /home/user/docs /mnt/backup
- 输出会显示 “将要复制的文件”,确认无误后去掉
--dry-run执行真实复制。
5. 后台运行(nohup)—— 适合超大型文件 / 文件夹
复制几十 GB / 上百 GB 文件时,避免终端关闭导致任务中断,用nohup让任务在后台运行:
# 后台运行,输出日志到rsync.log
nohup sudo rsync -av --progress --partial /home/user/big_data /mnt/backup > rsync.log 2>&1 &# 查看进度:实时查看日志
tail -f rsync.log
五、注意事项:避坑指南 + 权限说明
1. sudo 的使用场景(必须加 sudo 的 3 种情况)
- 复制系统文件 / 目录(如
/etc、/var):这些目录权限受限,普通用户无法读取 / 写入,必须用sudo。 - 复制其他用户的文件 / 目录(如
/home/other_user/docs):需sudo获取权限,否则会提示 “Permission denied”。 - 远程同步到远程服务器的系统目录(如
/opt、/usr/local):远程服务器的目标目录需 sudo 权限,此时用--rsync-path="sudo rsync":bash
sudo rsync -av --progress --rsync-path="sudo rsync" /data/server/ ubuntu@192.168.1.100:/opt/data
2. 避免误删:rsync 的 “--delete 参数” 慎用
--delete参数会让目标目录与源目录 “完全一致”(删除目标目录中源目录没有的文件),适合同步备份,但极易误删数据:
# 危险!目标目录中多余的文件会被删除
sudo rsync -av --progress --delete /home/user/docs /mnt/backup
- 建议:使用
--delete前,必须先用--dry-run测试,确认不会删除重要文件。
3. 软链接处理:-a 参数的坑
-a参数会保留软链接(等价于-l参数),若想 “跟随软链接复制实际文件”,需替换-a为-rptgoD(去掉-l),并添加-L参数:
# 跟随软链接,复制实际文件(而非链接本身)
sudo rsync -rptgoDv --progress -L /home/user/docs /mnt/backup
4. 磁盘空间检查
复制前先用df -h检查目标目录所在磁盘的剩余空间,避免因空间不足导致复制中断:
# 查看目标目录/mnt/backup所在磁盘的空间
df -h /mnt/backup
六、总结:rsync -av 的最佳使用场景
- 服务器迁移:无损复制系统文件、应用目录,保留权限和配置,迁移后直接可用。
- 数据备份:增量同步,每次仅备份变化的文件,节省磁盘空间和时间。
- 远程同步:跨服务器 / 跨网络同步文件,支持压缩和断点续传,适合低带宽场景。
- 大文件复制:比
cp快数倍,且有进度反馈,避免 “复制半天不知道进度” 的尴尬。
记住核心命令模板(直接套用):
# 本地复制文件夹(带进度+断点续传)
sudo rsync -av --progress --partial 源目录/ 目标目录# 远程同步(带压缩+进度)
sudo rsync -avz --progress --partial 本地目录/ 用户名@远程IP:远程目录
rsync 的强大远不止这些,但-av+--progress+--partial的组合已能覆盖 90% 的日常复制需求,掌握后彻底告别cp命令的低效和盲目!
