rsync
是一个非常强大的文件同步工具,广泛应用于 Linux/Unix 系统中。它不仅支持本地文件的同步,还可以通过网络进行远程文件传输。与传统的 scp
工具相比,rsync
的优势在于它的增量传输功能:只有发生变化的部分会被传输,从而大幅减少带宽和时间消耗。
rsync
基本语法
rsync [选项] 源路径 目标路径
- 源路径:可以是本地文件或目录,也可以是远程服务器上的文件或目录。
- 目标路径:同理,可以是本地或远程路径。
- 常用选项:
-a
:归档模式,保留文件权限、时间戳、符号链接等属性。-v
:详细输出,显示传输过程中的信息。-z
:压缩数据传输(适用于大文件或低带宽环境)。--delete
:删除目标路径中源路径不存在的文件(实现镜像同步)。--exclude
:排除特定的文件或目录。--progress
:显示传输进度。-r
:递归复制目录。-u
:仅更新目标文件中比源文件旧的文件。--dry-run
:模拟运行,不实际执行操作(用于测试命令是否正确)。
常见场景与实操案例
场景 1:本地文件夹同步
你有两个本地文件夹,希望将一个文件夹的内容同步到另一个文件夹。
需求:将 /home/user/source_dir
同步到 /home/user/backup_dir
。
命令:
rsync -av /home/user/source_dir/ /home/user/backup_dir/
解释:
-a
:归档模式,保留文件属性。-v
:显示详细信息。- 注意末尾的斜杠
/
,表示同步的是source_dir
内部的内容,而不是整个目录本身。
结果:
- 如果
backup_dir
中有source_dir
中没有的文件,它们不会被删除。 - 如果需要删除多余文件,可以加上
--delete
选项:rsync -av --delete /home/user/source_dir/ /home/user/backup_dir/
场景 2:远程备份
你希望将本地文件夹同步到远程服务器上的某个目录。
需求:将本地的 /home/user/data
文件夹同步到远程服务器的 /home/remote_user/backup
。
前提:已配置好 SSH 免密登录,或者提供密码认证。
命令:
rsync -avz /home/user/data/ remote_user@remote_server:/home/remote_user/backup/
解释:
-z
:启用压缩,适合大文件或低带宽环境。remote_user@remote_server
:指定远程服务器的用户名和地址。/home/remote_user/backup/
:远程服务器的目标路径。
结果:
- 只有新增或修改的文件会被传输到远程服务器。
- 如果需要排除某些文件(如日志文件),可以使用
--exclude
:rsync -avz --exclude "*.log" /home/user/data/ remote_user@remote_server:/home/remote_user/backup/
场景 3:从远程服务器下载文件
你希望从远程服务器下载文件到本地。
需求:将远程服务器的 /var/www/html
文件夹同步到本地的 /home/user/local_backup
。
命令:
rsync -avz remote_user@remote_server:/var/www/html/ /home/user/local_backup/
解释:
- 数据流向是从远程服务器到本地。
- 其他选项保持一致。
场景 4:增量同步并保留历史版本
你希望在同步时保留目标路径的历史版本。
需求:将 /home/user/projects
同步到 /mnt/backup/projects
,但每次同步时创建一个新的时间戳目录以保存历史版本。
命令:
TIMESTAMP=$(date +"%Y%m%d%H%M%S")
rsync -av /home/user/projects/ /mnt/backup/projects/$TIMESTAMP/
解释:
- 使用
$(date ...)
生成当前时间戳,作为子目录名称。 - 每次同步都会创建一个新的目录,保留历史版本。
场景 5:跨数据中心的大规模数据同步
假设你有一个大型分布式系统,需要定期将数据中心 A 的数据同步到数据中心 B。
需求:将数据中心 A 的 /data/files
同步到数据中心 B 的 /data/backup
。
命令:
rsync -avz --progress --partial --bwlimit=5000 /data/files/ user@datacenterB:/data/backup/
解释:
--progress
:显示传输进度。--partial
:允许断点续传,防止因网络中断导致传输失败。--bwlimit=5000
:限制传输带宽为 5000 KB/s,避免占用过多网络资源。
场景 6:只同步特定类型的文件
你希望只同步某些特定类型的文件,例如 .txt
和 .csv
。
需求:将 /home/user/documents
中的所有 .txt
和 .csv
文件同步到 /mnt/backup/docs
。
命令:
rsync -avz --include="*.txt" --include="*.csv" --exclude="*" /home/user/documents/ /mnt/backup/docs/
解释:
--include
:指定要包含的文件类型。--exclude="*"
:排除所有其他文件。
场景 7:删除目标路径中多余的文件
你希望确保目标路径的内容与源路径完全一致,包括删除目标路径中多余的文件。
需求:将 /home/user/source
同步到 /home/user/target
,并删除目标路径中多余的文件。
命令:
rsync -av --delete /home/user/source/ /home/user/target/
解释:
--delete
:删除目标路径中源路径不存在的文件。
总结
rsync
是一个功能强大且灵活的工具,适用于多种文件同步场景。以下是一些关键点:
- 增量传输:只传输变化的部分,节省时间和带宽。
- 灵活性:支持本地和远程同步,适合各种环境。
- 安全性:可以通过 SSH 加密传输,保护敏感数据。
- 高级功能:支持断点续传、带宽限制、文件过滤等。