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

fswatch单个移动操作触发多事件致照片重复导入问题

问题:fswatch监控文件夹导致照片重复导入Photos应用

现有脚本

photos.sh(JavaScript版osascript)

#!/usr/bin/osascript -l JavaScript

function run(argv) {
    return importFileIntoPhotos(argv[0])
};

// importFileIntoPhotos :: FilePath -> IO ()
const importFileIntoPhotos = fp => {
    const 
        appPhotos = Application("Photos");
    return appPhotos.import([Path(fp)])
};

test.sh(zsh脚本)

#!/bin/zsh

fp="$HOME/Documents/Samsung T5"

fpScript="$HOME/Library/CloudStorage/Dropbox/VSC Files/Automation/Manuel/photos.sh"

fswatch -0 -event-flags -r --exclude=".*\.DS_Store" "$fp" | xargs -0 -n1 -r -I {} "$fpScript" "{}"

问题现象与测试更新

执行test.sh后,将单张照片移入目标文件夹时,同一张照片会被重复导入到Photos应用,只能终止进程。

  • 更新1:进一步测试发现,照片导入Photos时会触发新的fswatch事件,导致重复执行。
  • 更新2:曾出现导入Photos不再触发fswatch事件、无重复问题的情况,原因未知。
  • 更新3:问题复现,用Preview打开文件时也会触发重复事件,不清楚为何Preview操作会被fswatch捕获。

设备规格:MacBook Air M1,macOS Ventura

修复方案

1. 过滤fswatch事件类型,仅处理文件新增类事件

fswatch默认会捕获多种文件系统事件(如修改、元数据变更等),我们可以只监听文件创建/移入事件,避免后续操作(比如Photos导入时的元数据修改、Preview打开时的缓存操作)触发重复执行。

修改test.sh中的fswatch命令:

fswatch -0 -event-flags -r --exclude=".*\.DS_Store" --event Created --event MovedTo "$fp" | xargs -0 -n1 -r -I {} "$fpScript" "{}"

--event Created和--event MovedTo仅监听文件被创建或移入目标文件夹的事件,后续对文件的其他操作不会触发脚本执行。

2. 给导入脚本添加去重逻辑

在photos.sh中检查文件是否已导入Photos,避免重复操作:

#!/usr/bin/osascript -l JavaScript

function run(argv) {
    return importFileIntoPhotos(argv[0])
};

// importFileIntoPhotos :: FilePath -> IO ()
const importFileIntoPhotos = fp => {
    const appPhotos = Application("Photos");
    const photoPath = Path(fp);
    // 通过文件名+文件大小双重校验是否已导入
    const existingPhotos = appPhotos.mediaItems.whose({
        originalFilename: photoPath.name(),
        fileSize: photoPath.size()
    });
    if (existingPhotos.length === 0) {
        return appPhotos.import([photoPath]);
    }
    return "文件已存在,跳过导入";
};

3. 延迟处理事件,合并短时间内的重复触发

如果仍存在重复触发问题,可以给执行逻辑添加延迟,合并短时间内的同一文件事件:
修改test.sh的管道部分:

fswatch -0 -event-flags -r --exclude=".*\.DS_Store" --event Created --event MovedTo "$fp" | xargs -0 -n1 -r -I {} sh -c 'sleep 1; if [ -f "{}" ]; then "$fpScript" "{}"; fi'

sleep 1会等待1秒再执行,这段时间内的重复事件会被合并;if [ -f "{}" ]确保执行时文件仍存在,避免文件被快速移除的异常情况。

内容的提问来源于stack exchange,提问作者F. Zer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:05:16