在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

我写了一个名为fswfswatchreplace,它有几个改进:

  • 这是一个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脚本的基础,它已经很稳固了。

(这是inotifywaitinotifywait在Linux上,另一方面,需要很多inotifywait在它之上,我还没有想出一个好方法来pipe理它,虽然我认为基于node.js东西可能是票。

这是一个使用sschober的工具的 sschober

 $ while true; do kqwait doc/my_file.md; make; done 

我有这个GIST,用法很简单

 watchfiles <cmd> <paths...> 

为了说明,每当file1file2发生变化时,以下命令将会响应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