监视文件夹中的更改,并在检测到更改时运行命令


Answers:


6

将这样的属性列表另存为~/Library/LaunchAgents/test.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>test</string>
    <key>ProgramArguments</key>
    <array>
        <string>say</string>
        <string>yy</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>~/Desktop/</string>
    </array>
</dict>
</plist>

可以使用代理程序加载该代理程序,也可以launchctl load ~/Library/LaunchAgents/test.plist通过注销并重新登录来加载该代理程序。应用更改需要卸载并加载plist。

~/波形扩展()默认在WatchPaths中工作。EnableGlobbing为ProgramArguments添加了通配符和波浪号扩展,但是它不影响Program或WatchPaths。

如果在上次调用后的十秒钟内修改了监视的文件,则会在system.log中添加如下消息:

com.apple.launchd.peruser.501[146]: (test) Throttling respawn: Will start in 7 seconds

消除消息的一种方法是在sleep 10脚本末尾添加类似内容。将ThrottleInterval设置为10并没有帮助。

未检测到监视文件夹的子文件夹中的更改。

请参阅man launchdman launchd.plist了解更多信息。


5

entr(1)是一个用于在文件更改时运行命令的实用程序。它读取STDIN上的文件列表,并使用kqueue(2)避免轮询。

例:

ls my_project/*.html | entr echo "file changed"

3

您可以使用“文件夹操作”,每当文件夹中的内容发生更改时,该操作都可以使您执行(自动)脚本。据我所知,Automator有一个模板,可让您轻松创建新的文件夹动作并将其附加到所需的文件夹。并且通过添加“运行Shell脚本”操作,您应该只获得所需的效果。


5
谢谢,但是看来“文件夹操作”仅在文件添加到文件夹时才触发,而不是在检查现有文件时才触发。
路易·B。

3

文件夹操作适合在添加或修改文件时触发。

但是,如果您对更改的定义包括删除文件,则OSX文件夹操作不会检测文件是否已删除。

要回答这个问题:

  1. 从此处下载FileWatcher依赖项:https : //github.com/eonist/swift-utils

  2. 熟悉自己的自我,并在以下命令行运行swift:http ://krakendev.io/blog/scripting-in-swift

  3. 使用此代码监视文件夹。

码:

var fileWatcher = FileWatcher(["~/Desktop/test/".tildePath])/*<---the fileWatcher instance must be scoped to your class*/

fileWatcher!.event = { event in
    Swift.print(self?.someVariable)//Outputs: a variable in your current class
    Swift.print(event.description)//Outputs: a description of the file change
}

1

Automator具有一种称为“文件夹操作”的工作流,当将某些内容添加到文件夹时,该工作流将自动运行。创建一个,然后使用操作“运行Shell脚本”。


4
谢谢,但是看来“文件夹操作”仅在文件添加到文件夹时才触发,而不是在检查现有文件时才触发。
路易·B。

哦好的。抱歉。
Timothy Mueller-Harder '02

0

您可能想要尝试这样的事情:

touch /tmp/dirb.tmp
while true do 
  ls /thedirtocheck > /tmp/dira.tmp 
  diff /tmp/dira.tmp /tmp/dirb.tmp || echo "something changed" 
  cp /tmp/dira.tmp /tmp/dirb.tmp 
  sleep 100 
done

您至少还ls -l需要捕获文件更改。
nohillside

对...错了
Holger von Ameln
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.