rsync同步文件命令介绍

Lear 2025-07-30 10:00:00
Categories: > Tags:

rsync同步文件命令介绍

rsync 是 Linux/Unix 系统中非常常用的文件同步工具,它可以高效地在本地或远程主机之间同步文件和目录。以下是对 rsync 命令的 由浅入深 的介绍,包括语法、常用参数、实战案例及高级用法。


一、基础概念


1. rsync 的作用






2. 基本语法


rsync [选项] 源路径 目标路径


源路径和目标路径都可以是本地路径,也可以是远程路径(格式为 user@host:/path)。


二、常用参数说明(基础)


参数 含义
-a 归档模式,相当于 -rlptgoD,保留权限等信息
-v 显示同步过程中的详细信息(verbose)
-z 在传输过程中进行压缩(适合网络慢的场景)
-r 递归复制子目录(-a 中已包含)
-P 显示进度,并保留已传输的数据(可断点续传)
–delete 删除目标目录中源目录没有的文件
-e ssh 指定使用 SSH 作为远程 shell

三、简单示例(从易到难)


1. 本地同步文件夹


rsync -av /home/user/docs/ /backup/docs/





2. 同步到远程服务器


rsync -avz /home/user/docs/ user@remote:/data/docs/




3. 从远程服务器拉取文件


rsync -avz user@remote:/data/docs/ /home/user/docs/



4. 使用 –delete 保持完全一致


rsync -avz –delete /home/user/docs/ user@remote:/data/docs/




四、高级用法


1. 指定排除文件或目录


rsync -av –exclude “node_modules/“ –exclude “*.log” /src/ /dest/



2. 使用 SSH 指定端口


rsync -av -e “ssh -p 2222” /src/ user@host:/dest/



3. 使用 rsync 同步定时任务(crontab)


编辑定时任务:


crontab -e


添加如下任务,每天凌晨 2 点同步一次:


0 2 * * * rsync -az /data/backup/ user@remote:/data/sync/


五、实用技巧


需求 命令
显示同步差异(不执行) rsync -avnc src/ dest/
限速传输 rsync –bwlimit=5000 -avz src/ dest/ (单位 KB/s)
使用密码认证 建议配合 SSH 密钥使用,无需输入密码
只同步文件结构 rsync -av –include ‘*/‘ –exclude ‘*‘ src/ dest/

六、总结


场景 推荐命令
本地同步 rsync -av /src/ /dest/
同步到远程 rsync -avz /src/ user@host:/dest/
保持完全一致 rsync -avz –delete /src/ user@host:/dest/
忽略部分文件 rsync -av –exclude “xxx” /src/ /dest/
自动化定时同步 配合 crontab 实现自动化

七、实用脚本


1. 同步本服务器指定目录下最近7天修改的文件到目标服务器


#!/bin/bash

# 定义源目录和目标目录
SOURCE_DIR=”/home/ubuntu/tmp/rsync-test/“
DEST_DIR=”/root/tmp/rsync-test/“

# 定义目标服务器的用户名和IP地址
# 请替换为您实际的目标服务器信息
TARGET_USER=”root”
TARGET_HOST=”your_target_server_ip”# 例如:192.168.1.100

# 要同步的时间范围(天)
DAYS=7

# 定义日志文件路径
LOG_FILE=”/var/log/rsync_recent_files.log”

# — 函数定义 —

# 记录日志
log_message() {
echo”$(date ‘+%Y-%m-%d %H:%M:%S’) - $1” | tee -a “$LOG_FILE”
}

# — 脚本开始 —

log_message “同步任务开始…”

# 确保源目录存在
if [ ! -d “$SOURCE_DIR” ]; then
log_message “错误:源目录 ‘$SOURCE_DIR’ 不存在。”
exit 1
fi

# 查找最近7天创建的文件,并将它们的相对路径输出到临时文件
# -maxdepth 1 限制只查找当前目录下的文件,不深入子目录
# 如果需要包含子目录中的文件,请删除 -maxdepth 1
# -type f 确保只查找文件,不包括目录
# -ctime -7 查找在7天内创建的文件 (change time, 对于新创建的文件通常等于creation time)
# -printf “%P\n” 输出相对于SOURCE_DIR的路径名
log_message “正在查找 ‘$SOURCE_DIR’ 中最近7天创建的文件…”
#find “$SOURCE_DIR” -maxdepth 1 -type f -ctime -7 -printf “%P\n” > /tmp/rsync_files_list.tmp
find “$SOURCE_DIR” -type f -ctime -$DAYS -printf”%P\n” > /tmp/rsync_files_list.tmp

# 检查是否有找到文件
if [ ! -s /tmp/rsync_files_list.tmp ]; then
log_message “在 ‘$SOURCE_DIR’ 中没有找到最近7天创建的文件,跳过同步。”
rm -f /tmp/rsync_files_list.tmp
log_message “同步任务完成,没有文件需要同步。”
exit 0
fi

log_message “找到以下文件需要同步(详情请查看 /tmp/rsync_files_list.tmp):”
# cat /tmp/rsync_files_list.tmp >> “$LOG_FILE” # 如果你想在日志中也包含文件列表,可以取消注释这行

# 使用 rsync 同步文件
# -a: 归档模式,等同于 -rlptgoD (递归、保留符号链接、权限、时间戳、组、所有者、设备文件)
# -v: 详细输出
# -z: 压缩文件数据传输
# –files-from: 从文件中读取要同步的文件列表
# –include-from=/tmp/rsync_files_list.tmp: 仅包含列表中的文件
# –exclude=’*‘: 排除所有其他文件,确保只同步列表中指定的文件
# –remove-source-files: (可选) 如果需要同步后删除源文件,请取消注释此行
log_message “正在将文件同步到 ${TARGET_USER}@${TARGET_HOST}:${DEST_DIR}…”
rsync -azv –files-from=/tmp/rsync_files_list.tmp “$SOURCE_DIR””${TARGET_USER}@${TARGET_HOST}:${DEST_DIR}”

# 检查 rsync 命令的退出状态
RSYNC_STATUS=$?
if [ $RSYNC_STATUS -eq 0 ]; then
log_message “文件同步成功完成。”
elif [ $RSYNC_STATUS -eq 24 ]; then
log_message “文件同步完成,但有一些文件在传输过程中消失了(这不是一个错误)。”
else
log_message “错误:文件同步失败,rsync 退出状态码:$RSYNC_STATUS”
fi

# 清理临时文件
rm -f /tmp/rsync_files_list.tmp
log_message “临时文件已清理。”

log_message “同步任务结束。”

exit 0