Mac上有“watch”或“inotifywait”这样的命令吗?

时间:2009-10-04 06:09:48

标签: macos watch inotify

我想在我的Mac(Snow Leopard)上观看一个文件夹然后执行一个脚本(给它一个刚刚移入文件夹的文件名(作为参数... x.sh“filename”))。

我有一个用bash(x.sh)编写的脚本,它会在输入$ 1上移动一些文件和其他内容我只需要OSX就可以在将新文件/文件夹移动/创建到目录时给我文件名

任何这样的命令?

14 个答案:

答案 0 :(得分:395)

fswatch

fswatch是一个使用Mac OS X FSEvents API监控目录的小程序。 当收到有关该目录的任何更改的事件时,指定的 shell命令由/bin/bash

执行

如果您使用的是GNU / Linux, inotifywatch(部分内容 大多数发行版上的inotify-tools包提供了类似的功能 功能。

更新: fswatch现在可用于多种平台,包括BSD,Debian和Windows。

语法/简单示例

可以观看多条路径的新方式 - 适用于版本1.x及更高版本

fswatch -o ~/path/to/watch | xargs -n1 -I{} ~/script/to/run/when/files/change.sh
  

注意:如果不是-oxargs输出的数字将添加到-I{}命令的末尾。如果您确实选择使用该号码,请将{}放在命令的任何位置。

版本0.x 的旧方式:

fswatch ~/path/to/watch ~/script/to/run/when/files/change.sh

使用Homebrew安装

截至2013年12月9日,已将其添加回homebrew - yay!因此,更新您的公式列表(brew update),然后您需要做的就是:

brew install fswatch

没有Homebrew的安装

Terminal.app

中输入这些命令
cd /tmp
git clone https://github.com/alandipert/fswatch
cd fswatch/
make
cp fswatch /usr/local/bin/fswatch

如果您的系统上没有c编译器,则可能需要安装Xcode或Xcode命令行工具 - 两者都是免费的。但是,如果是这种情况,您应该只是check out homebrew

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.

答案 1 :(得分:88)

您可以将launchd用于此目的。 Launchd可以配置为在修改文件路径时自动启动程序。

例如,当我的用户帐户的桌面文件夹被修改时,以下launchd config plist将启动程序/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>

要激活配置plist,请将其保存到Library文件夹中的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

上面的配置文件使用WatchPaths选项。或者你也可以使用 QueueDirectories选项。有关更多信息,请参见launchd手册页。

答案 2 :(得分:24)

通过Homebrew提供的Facebook watchman看起来也不错。它还支持过滤:

  

这两行在源目录上建立监视然后设置   一个名为&#34; buildme&#34;的触发器这将运行名为&#34; minify-css&#34;的工具。   每当CSS文件被更改时。该工具将传递一个列表   更改了文件名。

     

$ watchman watch ~/src

     

$ watchman -- trigger ~/src buildme '*.css' -- minify-css

请注意,路径必须是绝对路径。

答案 3 :(得分:21)

您可能想看一下(并可能展开)我的小工具kqwait。目前它只是坐在一起等待单个文件上的写事件,但kqueue架构允许分层事件堆叠......

答案 4 :(得分:14)

watchdog是一个用于监视文件/目录的跨平台python API,它内置了“技巧”工具,允许您在事件发生时触发操作(包括shell命令)(包括新添加的文件,已删除)文件和更改的文件)。

答案 5 :(得分:6)

这只是提及entr作为OSX的替代方案,以便在文件更改时运行任意命令。我发现它简单实用。

答案 6 :(得分:3)

修改: fsw已合并到fswatch。在此回答中,对fsw的任何引用现在应为fswatch

我在C ++中编写了一个名为fswatch的{​​{1}}替换,其中包含一些改进:

  • 这是一个GNU Build System项目,它建立在任何支持的平台上(OS X v。&gt; = 10.6)

    fsw
  • 多个路径可以作为不同的参数传递:

    ./configure && make && sudo make install
    
  • 它会转储包含所有事件信息的详细记录,例如:

    fsw file-0 ... file-n 
    
  • 它的输出很容易解析,因此Sat Feb 15 00:53:45 2014 - /path/to/file:inodeMetaMod modified isFile 输出可以通过管道输送到另一个进程。

  • 可以使用fsw自定义延迟。
  • 可以使用-l, --latency编写数字事件标志而不是文本标记。
  • 可以使用-n, --numeric格式字符串自定义时间格式。
  • 时间可以是本机的本地时间(默认情况下)或strftime的UTC时间。

获取fsw:

-t, --time-formathosted on GitHub,可以克隆其存储库获取:

-u, --utc-time

安装fsw:

可以使用以下命令安装

fsw

    git clone https://github.com/emcrisostomo/fsw

更多信息:

我还写了一篇介绍性的blog post,你可以在这里找到一些关于fsw如何运作的例子。

答案 7 :(得分:3)

这是使用sschober&#39; s tool的单行内容。

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

答案 8 :(得分:2)

Apple OSX Folder Actions允许您根据对文件夹执行的操作自动执行任务。

答案 9 :(得分:2)

fswatch的分支提供inotifywait -m的功能稍微少一些(没有等待,更多!我在Linux上遇到更多麻烦inotifywait ...)解析友好输出。

这是对原始fswatch的改进,因为它通过STDOUT发送更改文件的实际路径,而不是要求您提供它所分叉的程序。

作为我用来自动化东西的一系列可怕的bash脚本的基础,它一直坚如磐石。

另一方面,在Linux上

(这是偏离主题的)inotifywait,需要大量的基础知识,我仍然没有想出一个很好的方法来管理它,尽管我认为基于node.js的东西可能是票。

答案 10 :(得分:2)

我有一个GIST,用法非常简单

watchfiles <cmd> <paths...>

为了说明,每次Hello Worldfile1更改时,以下命令都会回显file2;并且默认间隔检查是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启用显示调试信息的verbose模式
  • -qwatchfiles安静地执行(#将会显示,以便用户可以看到程序正在执行)
  • -qqwatchfiles完全安静地执行
  • -h显示了帮助和用法

https://gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55

答案 11 :(得分:0)

我最终在macOS上这样做。我确信这在很多方面都很糟糕:

#!/bin/sh
# watchAndRun
if [ $# -ne 2 ]; then
    echo "Use like this:"
    echo "   $0 filename-to-watch command-to-run"
    exit 1
fi
if which fswatch >/dev/null; then
    echo "Watching $1 and will run $2"
    while true; do fswatch --one-event $1 >/dev/null && $2; done
else
    echo "You might need to run: brew install fswatch"
fi

答案 12 :(得分:0)

如果要使用NodeJS,则可以使用名为chokidar(或实际上为chokidar-cli)的包进行观看,然后使用rsync(Mac随附):

Rsync命令:

$ rsync -avz --exclude 'some-file' --exclude 'some-dir' './' '/my/destination'

Chokidar cli(通过npm全局安装):

chokidar \"**/*\" -c \"your-rsync-command-above\"

答案 13 :(得分:-2)

对于没有watch命令且每隔3秒执行一次命令的用户,这是一个简单的单行选择:

while :; do your-command; sleep 3; done

这是一个无限循环,基本上与执行以下操作相同:

watch -n3 your-command