在Mac上有没有类似“watch”或“inotifywait”的命令?
我想在我的Mac(Snow Leopard)上观看一个文件夹,然后执行一个脚本(给它一个刚刚移动到文件夹中的文件名(作为参数… x.sh“filename”))。
我有一个脚本全部写在bash(x.sh),将移动一些文件和其他东西input$ 1我只需要OSX给我的文件名称时,新的文件/文件夹被移动/创build到一个目录。
任何这样的命令?
fswatch
fswatch是一个使用Mac OS X FSEvents API监视目录的小程序。 当收到有关对该目录进行任何更改的事件时,指定的shell命令将由/bin/bash
执行
如果您使用GNU / Linux, inotifywatch (大多数发行版中的inotify-tools
软件包的一部分)提供了类似的function。
更新: fswatch
现在可以在多个平台上使用,包括BSD,Debian和Windows。
语法/一个简单的例子
可以观看多个path的新方法 – 对于版本1.x和更高版本 :
fswatch -o ~/path/to/watch | xargs -n1 ~/script/to/run/when/files/change.sh
版本0.x的老式方法:
fswatch ~/path/to/watch ~/script/to/run/when/files/change.sh
用自制软件安装
截至2013年12月9日,它被添加到自制 – 耶! 所以,更新你的公式列表( brew update
),然后你需要做的是:
brew install fswatch
没有自制软件的安装
在Terminal.app
键入这些命令
cd /tmp git clone https://github.com/alandipert/fswatch cd fswatch/ make cp fswatch /usr/local/bin/fswatch
如果你的系统没有c
编译器,你可能需要安装Xcode或Xcode命令行工具 – 两者都是免费的。 但是,如果是这样的话,你应该只是看看自制 。
fswatch
版本1.x的附加选项
Usage: fswatch [OPTION] ... path ... Options: -0, --print0 Use the ASCII NUL character (0) as line separator. -1, --one-event Exit fsw after the first set of events is received. -e, --exclude=REGEX Exclude paths matching REGEX. -E, --extended Use exended regular expressions. -f, --format-time Print the event time using the specified format. -h, --help Show this message. -i, --insensitive Use case insensitive regular expressions. -k, --kqueue Use the kqueue monitor. -l, --latency=DOUBLE Set the latency. -L, --follow-links Follow symbolic links. -n, --numeric Print a numeric event mask. -o, --one-per-batch Print a single message with the number of change events. in the current batch. -p, --poll Use the poll monitor. -r, --recursive Recurse subdirectories. -t, --timestamp Print the event timestamp. -u, --utc-time Print the event time as UTC time. -v, --verbose Print verbose output. -x, --event-flags Print the event flags. See the man page for more information.
你可以使用launchd来达到这个目的。 可以将Launchdconfiguration为在修改文件path时自动启动程序。
例如,当我的用户帐户的桌面文件夹被修改时,下面的启动configurationplist将启动程序/usr/bin/logger
:
<?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>logger</string> <key>ProgramArguments</key> <array> <string>/usr/bin/logger</string> <string>path modified</string> </array> <key>WatchPaths</key> <array> <string>/Users/sakra/Desktop/</string> </array> </dict> </plist>
要激活configurationplist保存到“库”文件夹LaunchAgents文件夹为“logger.plist”。
在shell中,您可以使用命令launchctl通过运行以激活logger.plist:
$ launchctl load ~/Library/LaunchAgents/logger.plist
桌面文件夹现在正在被监视。 每次它改变你应该在system.log中看到一个输出(使用Console.app)。 要停用logger.plist,请运行:
$ launchctl unload ~/Library/LaunchAgents/logger.plist
上面的configuration文件使用WatchPaths
选项。 或者,您也可以使用QueueDirectories
选项。 有关更多信息,请参阅launchd手册页。
你可能想看看(也许扩大)我的小工具kqwait
。 目前它只是坐在一旁,等待一个文件的写入事件,但kqueue架构允许分层事件堆栈…
Facebook的守望者 ,通过Homebrew,也看起来不错。 它也支持过滤:
这两行在源目录中build立一个监视,然后设置一个名为“buildme”的触发器,每当更改CSS文件时,都会运行一个名为“minify-css”的工具。 该工具将被传递一个更改的文件名列表。
$ watchman watch ~/src
$ watchman -- trigger ~/src buildme '*.css' -- minify-css
注意path必须是绝对的。
看门狗是一个用于监视文件/目录的跨平台python API,它内置了“技巧”工具,可以让您在发生事件(包括新增文件,删除文件和更改文件)时触发操作(包括shell命令)。
Apple OSX 文件夹操作允许您基于在文件夹上执行的操作来自动执行任务。
编辑: fsw
已被合并到fswatch
。 在这个答案中,任何对fsw
引用现在应该读取fswatch
。
我写了一个名为fsw
的fswatch
replace,它有几个改进:
-
这是一个GNU构build系统项目,它build立在任何支持的平台上(OS X v。> = 10.6)
./configure && make && sudo make install
-
多个path可以作为不同的parameter passing:
fsw file-0 ... file-n
-
它会logging所有事件信息的详细logging,例如:
Sat Feb 15 00:53:45 2014 - /path/to/file:inodeMetaMod modified isFile
-
它的输出很容易parsing,因此
fsw
输出可以传送到另一个进程。 - 延迟可以用
-l, --latency
来定制。 - 数字事件标志可以用
-n, --numeric
数字来代替文本标志。 - 时间格式可以使用带
-t, --time-format
strftime
格式string来定制。 - 时间可以是机器的本地时间(默认)或UTC时间,
-u, --utc-time
。
获得fsw:
fsw
托pipe在GitHub上 ,可以获得克隆其存储库的权限:
git clone https://github.com/emcrisostomo/fsw
安装fsw:
可以使用以下命令安装fsw
:
./configure && make && sudo make install
更多信息:
我还写了一篇介绍性的博客文章 ,您可以在这里find几个关于fsw
如何工作的示例。
这只是提到在OSX上,作为一个替代scheme,以便在文件更改时运行任意命令。 我觉得它简单而有用。
我的fork的fswatch提供了inotifywait -m
的function,稍微less一些(不用等,更多!我有更多的inotifywait
Linux的inotifywait
…)parsing友好的输出。
这是对原始fswatch
的改进,因为它通过STDOUT发送了更改文件的实际path,而不是要求您提供它分支的程序。
作为我用来实现自动化的一系列可怕的bash脚本的基础,它已经很稳固了。
(这是inotifywait
) inotifywait
在Linux上,另一方面,需要很多inotifywait
在它之上,我还没有想出一个好方法来pipe理它,虽然我认为基于node.js
东西可能是票。
这是一个使用sschober
的工具的 sschober
。
$ while true; do kqwait doc/my_file.md; make; done
我有这个GIST,用法很简单
watchfiles <cmd> <paths...>
为了说明,每当file1
或file2
发生变化时,以下命令将会响应Hello World
。 默认的间隔检查是1秒
watchfiles 'echo Hello World' /path/to/file1 /path/to/file2
如果我想每5秒检查一次,我可以使用-t
标志
watchfiles -t 'echo Hello World' /path/to/file1 /path/to/file2
-
-v
启用显示debugging信息的verbose
模式 -
-q
使watchfiles
安静地执行(#
将显示,以便用户可以看到程序正在执行) -
-qq
使watchfiles
完全安静地运行 -
-h
显示帮助和用法
https://gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55
对于没有watch
命令的用户每3秒钟执行一次命令,以下是一个简单的单行select:
while :; do your-command; sleep 3; done
这是一个无限循环,基本上与以下操作相同:
watch -n3 your-command