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
相关产品推荐
相关产品推荐

