rsync
是 Linux/Unix 系统中非常常用的文件同步工具,它可以高效地在本地或远程主机之间同步文件和目录。以下是对 rsync
命令的 由浅入深 的介绍,包括语法、常用参数、实战案例及高级用法。
一、基础概念
1. rsync 的作用
同步本地文件/目录;
同步远程文件/目录(通过 SSH);
支持增量复制(只同步变化的部分);
支持压缩传输、权限保留、断点续传等功能。
2. 基本语法
rsync [选项] 源路径 目标路径
源路径和目标路径都可以是本地路径,也可以是远程路径(格式为 user@host:/path
)。
二、常用参数说明(基础)
三、简单示例(从易到难)
1. 本地同步文件夹
rsync -av /home/user/docs/ /backup/docs/
将
/home/user/docs/
同步到/backup/docs/
-a
保留权限,-v
显示过程注意源路径最后的
/
表示目录内容,不加则会把整个目录拷贝进去
2. 同步到远程服务器
rsync -avz /home/user/docs/ user@remote:/data/docs/
将本地
/home/user/docs/
同步到远程服务器/data/docs/
使用 SSH 传输,自动压缩,提高效率
3. 从远程服务器拉取文件
rsync -avz user@remote:/data/docs/ /home/user/docs/
从远程服务器
/data/docs/
拉取文件到本地
4. 使用 --delete
保持完全一致
rsync -avz --delete /home/user/docs/ user@remote:/data/docs/
如果远程目录比源目录多出文件,会被删除
谨慎使用,可能导致数据丢失
四、高级用法
1. 指定排除文件或目录
rsync -av --exclude "node_modules/" --exclude "*.log" /src/ /dest/
不同步
node_modules
文件夹和.log
文件
2. 使用 SSH 指定端口
rsync -av -e "ssh -p 2222" /src/ user@host:/dest/
如果 SSH 不是默认 22 端口,可以这样指定
3. 使用 rsync 同步定时任务(crontab)
编辑定时任务:
crontab -e
添加如下任务,每天凌晨 2 点同步一次:
0 2 * * * rsync -az /data/backup/ user@remote:/data/sync/
五、实用技巧
六、总结
七、实用脚本
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