You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 05:13:17