有没有像“守望”这样的命令?或“;inotifywait"在Mac上?

我想在我的Mac上监视一个文件夹,然后执行一个bash脚本,将刚刚移动到或在监视目录中创建的任何文件/文件夹的名称传递给它。

155124 次浏览

Apple OSX 文件夹的行动允许您根据对文件夹采取的操作自动化任务。

你可以使用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,请将其保存到库文件夹中的LaunchAgents文件夹“logger.plist”。

在shell中,您可以使用命令launchctl来激活记录器。通过运行Plist:

$ launchctl load ~/Library/LaunchAgents/logger.plist

桌面文件夹现在正在被监视。每次它被更改时,您都应该在system.log中看到一个输出(使用Console.app)。 要停用记录器。plist,运行:< / p >

$ launchctl unload ~/Library/LaunchAgents/logger.plist
上面的配置文件使用了WatchPaths选项。或者,您也可以使用 QueueDirectories选项。有关更多信息,请参阅launchd手册页

你可能想看一看(或者扩展一下)我的小工具kqwait。目前它只是坐在那里等待单个文件上的写事件,但kqueue架构允许分层事件堆叠…

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

fswatch

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

执行

如果你使用GNU/Linux, inotifywatch(部分 大多数发行版上的inotify-tools包)提供类似的功能 功能。< / p >

更新: fswatch现在可以在许多平台上使用,包括BSD, Debian和Windows。

语法/简单示例

可以监视多条路径的新方法——对于版本1。X及以上:

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

注意:如果没有-I{}. 0,由-o输出的数字将被添加到xargs命令的末尾。如果你选择使用这个数字,把{}放在你的命令中的任何地方。

版本0. x的旧方法:

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

使用Homebrew安装

在13年9月12日,它被添加回家酿 -耶!因此,更新你的公式列表(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命令行工具——都是免费的。然而,如果是这种情况,你可能应该看看自制啤酒

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.

我的fswatch分支提供的inotifywait -m的功能略少(不,等等,更多!)我在Linux上使用inotifywait…)解析友好的输出有很多问题。

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

它是我用来实现自动化的一系列可怕的bash脚本的坚实基础。

(这是跑题了)Linux上的inotifywait,另一方面,需要大量的拼凑在它上面,我仍然没有找到一个好方法来管理它,尽管我认为基于node.js的东西可能是门票。

这里有一个简单的单行替代方案,供那些没有watch命令但又想每3秒执行一次命令的用户使用:

< p > <代码> 而:;做您的命令;睡眠3;完成 < /代码> < / p >

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

< p > <代码> 看-n3你的命令 < /代码> < / p >

编辑: fsw已合并到fswatch。在这个答案中,任何对fsw的引用现在都应该读为fswatch

我在c++中写了一个名为fswfswatch替换,它有几个改进:

  • 这是一个GNU构建系统项目,它构建在任何受支持的平台(OS X v. >= 10.6)上

    ./configure && make && sudo make install
    
  • Multiple paths can be passed as different arguments:

    fsw file-0 ... file-n
    
  • It dumps a detailed record with all the event information such as:

    Sat Feb 15 00:53:45 2014 - /path/to/file:inodeMetaMod modified isFile
    
  • Its output is easy to parse so that fsw output can be piped to another process.

  • Latency can be customised with -l, --latency.
  • Numeric event flags can be written instead of textual ones with -n, --numeric.
  • The time format can be customised using strftime format strings with -t, --time-format.
  • The time can be the local time of the machine (by default) or UTC time with -u, --utc-time.

Getting fsw:

fsw is hosted on GitHub and can be obtained cloning its repository:

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

安装的焊:

fsw可以通过以下命令安装:

    ./configure && make && sudo make install

进一步的信息:

我还写了一个介绍性的博客,在那里你可以找到一些关于fsw如何工作的例子。

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

这两行在源目录上建立一个监视,然后设置 在名为buildme的触发器上运行一个名为miniify -css的工具 每当CSS文件被更改时。工具将被传递一个列表 改变文件名。< / p >

$ watchman watch ~/src

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

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

下面是使用sschober工具的一行代码。

$ while true; do kqwait ./file-to-watch.js; script-to-execute.sh; done

这只是提到entr作为OSX上的一个替代方案,当文件发生变化时可以运行任意命令。我发现它既简单又有用。

  • macos上的brew install entr
  • Debian/Ubuntu上的apt install entr

我有一个关于这个的主旨,用法很简单

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启用显示调试信息的verbose模式
  • -q使watchfiles安静地执行(将显示#,以便用户可以看到程序正在执行)
  • -qq使watchfiles完全安静地执行
  • -h显示帮助和用法

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

我最终为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

如果你想使用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\"

Sudo fs_usage -f filesys | grep“有趣的东西”;?

我可以全心全意地推荐使用watchexec。内置Rust和它只是工作™,无论你在哪个平台上!还有简单的CLI选项。