Files
Linux/File/Shell/rsync_inotify.sh
offends cee91802b3
Some checks failed
continuous-integration/drone Build is failing
synchronization
2025-08-25 15:57:40 +08:00

85 lines
2.7 KiB
Bash

#!/bin/bash
#############################################################################################
# 用途: inotify 同步脚本
# 作者: 丁辉
# 更新时间: 2024-03-28
#############################################################################################
# rsync 服务端 IP
HOST=none
# rsync 用户名
USER=rsync
# rsync 密码文件
PASSWORD=/etc/rsync.pass
# 同步目录
SRC=/data/
# rsync 模块
Module=data
# inotifywait 命令
inotifywait=/usr/bin/inotifywait
#### Inotifywait 参数解释
# -m: 监控目录
# -r: 递归监控
# -q: 静默模式
# --timefmt: 时间格式
# %Y: 年
# %m: 月
# %d: 日
# %H: 时
# %M: 分
# --format: 输出格式
# %T: 时间
# %w: 目录
# %f: 文件
# %e: 事件
# %Xe: 扩展事件
# -e: 监控事件
# modify: 文件内容修改
# delete: 文件删除
# create: 文件创建
# attrib: 文件属性修改
# move: 文件移动
# close_write: 文件关闭写入
##### Rsync 参数解释
# -a: 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
# -r: 相对路径传输文件
# -t: 保持文件时间信息
# -u: 仅传输更新文件
# -z: 传输时压缩
# -v: 详细模式输出
# -c: 跳过校验算法,仅根据文件时间和大小判断是否同步
# -P: 保持文件传输进度
# 监控目录
cd $SRC
$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f %Xe' -e modify,delete,create,attrib,move,close_write ./ \
| while read files ;do
# 获取文件路径
FILE_PWD=$(echo $files | awk '{print $3}')
# 获取文件事件
FILE_EVENT=$(echo $files | awk '{print $4}')
# 在日志内提示时间
echo ".....................................$(date)....................................."
# 增加、修改、写入完成、移动进事件
if [[ $FILE_EVENT =~ "CREATE" ]] || [[ $FILE_EVENT =~ "MODIFY" ]] || [[ $FILE_EVENT =~ "CLOSE_WRITE" ]] || [[ $FILE_EVENT =~ "MOVED_TO" ]]; then
rsync -artuz --password-file=${PASSWORD} $(dirname ${FILE_PWD}) ${USER}@${HOST}::${Module}
fi
# 删除、移动事件触发
if [[ $FILE_EVENT =~ "DELETE" ]] || [[ $FILE_EVENT =~ "MOVED_FROM" ]]; then
rsync -artuz --password-file=${PASSWORD} $(dirname ${FILE_PWD}) ${USER}@${HOST}::${Module}
fi
# 修改属性事件触发[ touch, chgrp, chmod, chown ]
if [[ $FILE_EVENT =~ "ATTRIB" ]]; then
# 判断是否为目录, 如果是目录则不同步(在目录下文件修改属性时, 目录属性也会被修改)
if [ ! -d "$INO_FILE" ]; then
rsync -artuz --password-file=${PASSWORD} $(dirname ${FILE_PWD}) ${USER}@${HOST}::${Module}
fi
fi
done