如何编写Bash脚本监控文件夹变更并同步内容至另一文件夹
实现文件夹变更监控与自动同步的Bash脚本
当然可以!这是个非常实用的需求,我常用inotifywait(专门监控文件系统事件的轻量工具)搭配rsync(高效的文件同步工具)来实现,这俩工具在绝大多数Linux发行版里都能轻松安装部署。
第一步:安装依赖工具
根据你的Linux发行版选择对应命令安装:
- Debian/Ubuntu 系列:
sudo apt update && sudo apt install inotify-tools rsync -y - RHEL/CentOS 系列:
sudo yum install inotify-tools rsync -y
第二步:编写监控同步脚本
创建一个名为folder_sync.sh的脚本,记得替换成你自己的源文件夹和目标文件夹路径:
#!/bin/bash # 配置你的源文件夹和目标文件夹路径 SOURCE_DIR="/path/to/your/source/folder" TARGET_DIR="/path/to/your/target/folder" # 检查源文件夹是否存在,不存在则退出 if [ ! -d "$SOURCE_DIR" ]; then echo "错误:源文件夹 $SOURCE_DIR 不存在!" exit 1 fi # 检查目标文件夹,不存在则自动创建 if [ ! -d "$TARGET_DIR" ]; then echo "目标文件夹不存在,正在创建..." mkdir -p "$TARGET_DIR" fi echo "开始监控文件夹:$SOURCE_DIR,同步至:$TARGET_DIR" # 持续监控源文件夹的核心变更事件 inotifywait -m -r -e create,delete,modify,move "$SOURCE_DIR" | while read -r directory events filename; do echo "检测到变更:$events 在 $directory$filename" # rsync同步,-a是归档模式(同步权限、时间戳、子文件夹等),--delete会删除目标中源没有的文件(按需启用) rsync -av --delete "$SOURCE_DIR/" "$TARGET_DIR/" echo "同步完成于 $(date '+%Y-%m-%d %H:%M:%S')" done
第三步:脚本使用说明
- 给脚本添加执行权限:
chmod +x folder_sync.sh - 前台直接运行(关闭终端会停止监控):
./folder_sync.sh - 后台持续运行(关闭终端也不会中断):
运行日志会自动保存在当前目录的nohup ./folder_sync.sh &nohup.out文件里。
实用调整建议
- 自定义监控事件:如果不需要监控删除操作,可以把
-e create,delete,modify,move改成-e create,modify,move; - 排除特定内容:不想同步临时文件的话,给rsync加
--exclude='*.tmp'参数,排除文件夹则用--exclude='temp_dir/'; - 开机自动运行:可以把脚本做成systemd服务,创建
/etc/systemd/system/folder-sync.service文件:
然后执行[Unit] Description=Folder Sync Monitor After=network.target [Service] User=your_username ExecStart=/path/to/your/folder_sync.sh Restart=always [Install] WantedBy=multi-user.targetsudo systemctl daemon-reload、sudo systemctl enable folder-sync、sudo systemctl start folder-sync即可开机自启。
内容的提问来源于stack exchange,提问作者Mr. Foxy
相关产品推荐
相关产品推荐

