fswatch是macOS上基于kqueue机制的轻量实时文件监控工具,无需root权限,支持精准监听JS变更并自动压缩为.min.js。

Mac终端监控文件实时变化,核心是让系统在文件被创建、修改或删除的瞬间立即通知你,而不是靠定时轮询扫描——这能省电、降低延迟、避免漏事件。fswatch是macOS上最轻量、响应最快、无需root权限的原生级工具,它直接对接内核的kqueue机制,一有动静就推路径出来。
安装与基础监听
先确认是否已安装:在终端输入 fswatch --version。若提示 command not found,则运行:
brew install fswatch
安装完成后,立刻测试监听当前目录:
fswatch .
这时终端会进入阻塞状态,不输出任何内容——别慌,这是正常行为。只要你在当前目录里新建一个文件(比如 touch test.txt),终端马上打印出完整路径 ./test.txt。注意:默认输出含事件类型(如 Created、Modified),但不带时间戳,也不自动去重。
精准捕获JS文件变更并自动压缩
适用于前端开发场景:源码写在 src/ 目录下,每次保存 .js 文件,自动用 uglifyjs 压缩生成同名 .min.js。
方法一:单行管道链(适合快速验证)
fswatch -o src/ | xargs -n1 -I{} sh -c '[[ "$1" == *.js ]] && [[ "$1" != *.min.js ]] && uglifyjs "$1" -o "${1%.js}.min.js"' _ {}
方法二:可维护脚本(推荐长期使用)
新建 monitor-js.sh:
#!/bin/zsh
while read -r path; do
if [[ "$path" == *.js ]] && [[ "$path" != *.min.js ]]; then
src_file="$path"
dst_file="${path%.js}.min.js"
echo "→ Compressing $src_file"
uglifyjs "$src_file" -o "$dst_file" 2>/dev/null || echo "⚠️ uglifyjs failed on $src_file"
fi
done
赋予执行权限后运行:
chmod +x monitor-js.sh → ./monitor-js.sh
【注意:脚本中必须用 -o 参数,否则 fswatch 输出的是事件对象而非纯路径,xargs 无法正确解析】
监听多个目录并分发不同动作
当你同时维护前端代码、配置文件和日志模板时,需要为不同路径绑定专属响应逻辑。
第一步:启动第一个监听任务(前台)
fswatch -0 ~/project/src | while read -d "" event; do echo "[SRC] $(basename "$event") changed"; done
第二步:启动第二个监听任务(后台)
fswatch -0 ~/project/config | while read -d "" event; do echo "[CFG] $(basename "$event") modified"; done &
第三步:启动第三个监听任务(后台,带防抖)
fswatch -l 0.3 -0 ~/project/templates | while read -d "" event; do echo "[TPL] $(basename "$event") updated"; done &
这样三个监听器互不干扰,各自独立运行。-0 表示用 null 字符分隔事件,避免空格路径出错;-l 0.3 是关键防抖参数,防止编辑器自动保存触发多次重复事件。
捕获结构变更并记录时间戳
方法一:一行命令输出带毫秒精度的时间戳
fswatch -o ~/Documents/Sensitive | xargs -n1 -I{} date "+%Y-%m-%d %H:%M:%S.%3N" | xargs -I{} echo "{} → {}"
方法二:用 while 循环+stat获取更准确的最后修改时间(推荐)
fswatch -o ~/Documents/Sensitive | while read -r file; do
if [ -f "$file" ]; then
stat -f "%Sm — %N" -t "%Y-%m-%d %H:%M:%S" "$file"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') — DIR: $file"
fi
done
注意:stat -f "%Sm" 获取的是文件元数据里的修改时间,比 fswatch 自带事件时间更可信,尤其当系统时钟跳变或进程调度延迟时。

















