launchd tem um recurso chamado watchpaths que pode executar um script .sh ou qualquer outra por favor quando ocorrerem mudanças.
dependendo dos requisitos de segurança dos caminhos que você está procurando monitorar e quando gostaria de monitorar (quando logado ou sempre?); determina onde você coloca o plist.
~/Library/LaunchAgents Per-user agents provided by the user.
/Library/LaunchAgents Per-user agents provided by the administrator.
/Library/LaunchDaemons System-wide daemons provided by the administrator.
/System/Library/LaunchAgents Per-user agents provided by Mac OS X.
/System/Library/LaunchDaemons System-wide daemons provided by Mac OS X.
Exemplo: ~/Library/LaunchAgents/com.tellemewhen.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.tellemewhen.plist</string>
<key>OnDemand</key>
<true/>
<key>Program</key>
<string>/PATH/TO/YOURSCIPTTORUN.sh</string>
<key>ProgramArguments</key>
<array>
<string></string>
</array>
<key>WatchPaths</key>
<array>
<string>/path/to/watch</string>
</array>
</dict>
</plist>
launchctl load ~/Library/LaunchAgents/com.tellemewhen.plist
carrega o plist.