如何配置inotifywait在事件停止5秒后仅执行一次FileBot命令?
问题与解决方案
现有脚本
#!/bin/bash WATCH_DIR="/home/media/Movies" # FileBot 命令 FILEBOT_CMD="filebot -rename -r -non-strict \"$WATCH_DIR\" --db TheTVDB --format \"{n}/Season {s}/{n} - {s00e00} - {t}\" --action move --order Airdate" # 监控目录变化 inotifywait -m -r -e close_write "$WATCH_DIR" --format '%w%f' | while read file; do echo "检测到文件变更: $file" eval $FILEBOT_CMD done
现状与需求
现有脚本通过inotifywait监控指定目录的close_write事件,每次检测到文件写入完成后立即执行FileBot重命名移动命令,可正常运行。但存在以下需求:
- 批量复制多个文件时,避免多次重复执行FileBot命令
- 等待所有文件复制完成(连续5秒无新事件触发)后,仅执行一次FileBot命令
- 逻辑不受文件大小影响
修改后的脚本方案
核心思路是设置延迟执行的定时器,每次收到新事件就重置定时器,仅当5秒内无新事件时才执行FileBot命令:
#!/bin/bash WATCH_DIR="/home/media/Movies" # 延迟时间(秒),可按需调整 DELAY=5 # 存储定时器进程ID TIMER_PID=0 # FileBot 命令 FILEBOT_CMD="filebot -rename -r -non-strict \"$WATCH_DIR\" --db TheTVDB --format \"{n}/Season {s}/{n} - {s00e00} - {t}\" --action move --order Airdate" # 定义执行FileBot的函数 run_filebot() { echo "等待$DELAY秒无新事件,开始执行FileBot..." eval $FILEBOT_CMD } # 监控目录变化 inotifywait -m -r -e close_write "$WATCH_DIR" --format '%w%f' | while read file; do echo "检测到文件变更: $file" # 若之前有定时器在运行,先终止(重置计时) if [ $TIMER_PID -ne 0 ]; then kill $TIMER_PID 2>/dev/null fi # 启动新定时器:延迟DELAY秒后执行run_filebot (sleep $DELAY && run_filebot) & TIMER_PID=$! done
说明
- 每次检测到新的
close_write事件时,会立即终止之前的延迟定时器,重新启动5秒倒计时 - 仅当连续5秒无新事件触发时,才执行FileBot命令,确保批量文件复制完成后仅执行一次
2>/dev/null用于忽略kill不存在进程的错误输出,避免脚本报错- 延迟时间
DELAY可根据实际需求调整(比如改为10秒)
内容的提问来源于stack exchange,提问作者PickOne
相关产品推荐
相关产品推荐

