在目录修改时运行脚本

在目录修改时运行脚本

因为launchd存在WatchPaths(以及某些更具体的情况QueueDirectories)监控路径上的变化。但是,如果它是一个目录,它将仅识别目录中的创建/删除,即不会识别包含文件的内容更改或任何子目录中的任何更改(请参阅这里)。

(对于 Linux,似乎列出了一些好的解决方案这里

好像launchd是做不到吧?

我可以编写自己的始终运行的守护进程,并launchd通过 FSEvents(或 kqueue)扩展此功能,家庭或者野孩子?)。

或者是否存在现有的项目/工具可以做到这一点?

答案1

launchd还应该监视目录下文件(直接)的更改WatchPaths

尝试将此 plist 另存为~/Library/LaunchAgents/test.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>test</string>
  <key>ProgramArguments</key>
  <array>
    <string>say</string>
    <string>a</string>
  </array>
  <key>WatchPaths</key>
  <array>
    <string>~/Documents/</string>
  </array>
</dict>
</plist>

然后运行launchctl load ~/Library/LaunchAgents/test.plist并修改 下的某个文件。即使您在未执行原子保存的情况下修改文件,或者即使 的修改时间未发生改变,~/Documents/程序也应该运行。~/Documents/

请注意,launchd不会监视所监视目录的子目录中的更改。波浪号扩展在默认情况下在的参数中起作用WatchPaths,但无法启用文件名扩展。(EnableGlobbing仅适用于ProgramArguments。)

相关内容