macos Mac 上是否有“watch”或“inotifywait”之类的命令?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1515730/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Is there a command like "watch" or "inotifywait" on the Mac?
提问by Mint
I want to watch a folder on my Mac (Snow Leopard) and then execute a script (giving it the filename of what was just moved into a folder (as a parameter... x.sh "filename")).
我想在我的 Mac (Snow Leopard) 上观看一个文件夹,然后执行一个脚本(给它刚刚移动到文件夹中的文件名(作为参数... x.sh“文件名”))。
I have a script all written up in bash (x.sh) that will move some files and other stuff on input $1 I just need OSX to give me the file name when new files/folders are moved/created into a dir.
我有一个全部用 bash (x.sh) 编写的脚本,该脚本将在输入 $1 上移动一些文件和其他内容,当新文件/文件夹移动/创建到目录时,我只需要 OSX 给我文件名。
Any such command?
有这样的命令吗?
回答by cwd
fswatch
fswatch
fswatchis a small program using the Mac OS X FSEvents API to monitor a directory.
When an event about any change to that directory is received, the specified
shell command is executed by /bin/bash
fswatch是一个使用 Mac OS X FSEvents API 来监视目录的小程序。当收到有关对该目录进行任何更改的事件时,指定的 shell 命令由/bin/bash
If you're on GNU/Linux,
inotifywatch(part of the
inotify-tools
package on most distributions) provides similar
functionality.
如果您使用的是 GNU/Linux,
inotifywatch(inotify-tools
大多数发行版中的软件包的一部分
)提供了类似的功能。
Update:fswatch
can now be used across many platforms including BSD, Debian, and Windows.
更新:fswatch
现在可以跨多个平台使用,包括 BSD、Debian 和 Windows。
Syntax / A Simple Example
语法 / 一个简单的例子
The new way that can watch multiple paths - for versions 1.x and higher:
可以观察多个路径的新方法 - 对于1.x 及更高版本:
fswatch -o ~/path/to/watch | xargs -n1 -I{} ~/script/to/run/when/files/change.sh
Note: The number output by
-o
will get added to the end of thexargs
command if not for the-I{}
. If you do choose to use that number, place{}
anywhere in your command.
注:由输出数量
-o
将被添加到年底xargs
,如果不是命令-I{}
。如果您确实选择使用该编号,请将其{}
放置在您的命令中的任何位置。
The older way for versions 0.x:
版本 0.x的旧方法:
fswatch ~/path/to/watch ~/script/to/run/when/files/change.sh
Installation with Homebrew
使用 Homebrew 安装
As of 9/12/13 it was added back in to homebrew- yay! So, update your formula list (brew update
) and then all you need to do is:
截至 2013 年 9 月 12 日,它已重新添加到自制软件中- 是的!因此,更新您的公式列表 ( brew update
),然后您需要做的就是:
brew install fswatch
Installation without Homebrew
没有 Homebrew 的安装
Type these commands in Terminal.app
输入这些命令 Terminal.app
cd /tmp
git clone https://github.com/alandipert/fswatch
cd fswatch/
make
cp fswatch /usr/local/bin/fswatch
If you don't have a c
compiler on your system you may need to install Xcode or Xcode command line tools - both free. However, if that is the case, you should probably just check out homebrew.
如果您c
的系统上没有编译器,您可能需要安装 Xcode 或 Xcode 命令行工具——两者都是免费的。但是,如果是这种情况,您可能应该查看 homebrew。
Additional Options for fswatch
version 1.x
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.
回答by sakra
You can use launchdfor that purpose. Launchd can be configured to automatically launch a program when a file path is modified.
您可以为此目的使用launchd。Launchd 可以配置为在修改文件路径时自动启动程序。
For example the following launchd config plist will launch the program /usr/bin/logger
when the desktop folder of my user account is modified:
例如,/usr/bin/logger
当我的用户帐户的桌面文件夹被修改时,以下 launchd config 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>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>
To activate the config plist save it to the LaunchAgents folder in your Library folder as "logger.plist".
要激活配置 plist,请将其作为“logger.plist”保存到 Library 文件夹中的 LaunchAgents 文件夹。
From the shell you can then use the command launchctl
to activate the logger.plist by running:
然后,您可以在 shell 中使用该命令launchctl
通过运行以下命令来激活 logger.plist:
$ launchctl load ~/Library/LaunchAgents/logger.plist
The desktop folder is now being monitored. Every time it is changed you should see an output in the system.log (use Console.app). To deactivate the logger.plist, run:
现在正在监视桌面文件夹。每次更改时,您都应该在 system.log 中看到输出(使用 Console.app)。要停用 logger.plist,请运行:
$ launchctl unload ~/Library/LaunchAgents/logger.plist
The configuration file above uses the WatchPaths
option. Alternatively you can also use the
QueueDirectories
option. See the launchdman page for more information.
上面的配置文件使用了该WatchPaths
选项。或者,您也可以使用该
QueueDirectories
选项。有关更多信息,请参阅launchd手册页。
回答by Jakub Holy
Facebook's watchman, available via Homebrew, also looks nice. It supports also filtering:
Facebook 的watchman,可通过 Homebrew 获得,看起来也不错。它还支持过滤:
These two lines establish a watch on a source directory and then set up a trigger named "buildme" that will run a tool named "minify-css" whenever a CSS file is changed. The tool will be passed a list of the changed filenames.
$ watchman watch ~/src
$ watchman -- trigger ~/src buildme '*.css' -- minify-css
这两行在源目录上建立监视,然后设置一个名为“buildme”的触发器,每当 CSS 文件发生更改时,该触发器将运行名为“minify-css”的工具。该工具将传递一个已更改文件名的列表。
$ watchman watch ~/src
$ watchman -- trigger ~/src buildme '*.css' -- minify-css
Notice that the path must be absolute.
请注意,路径必须是绝对路径。
回答by sschober
回答by gfxmonk
watchdogis a cross-platform python API for watching files / directories, and it has builtin "tricks" tool that allows you to trigger actions (including shell commands) when events occur (including new added file, removed file and changed file).
watchdog是一个用于监视文件/目录的跨平台 python API,它具有内置的“技巧”工具,允许您在发生事件(包括新添加的文件、删除的文件和更改的文件)时触发操作(包括 shell 命令)。
回答by Donny Winston
回答by Joshua Cook
回答by Enrico M. Crisostomo
Edit:fsw
has been merged into fswatch
. In this answer, any reference to fsw
should now read fswatch
.
编辑:fsw
已合并到fswatch
. 在这个答案中,任何参考fsw
现在都应该阅读fswatch
.
I wrote an fswatch
replacement in C++ called fsw
which features several improvements:
我fswatch
用 C++写了一个替代品,fsw
它有几个改进:
It's a GNU Build System project which builds on any supported platform (OS X v. >= 10.6) with
./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 localtime of the machine (by default) or UTC time with
-u, --utc-time
.
这是一个 GNU 构建系统项目,它构建在任何受支持的平台 (OS X v. >= 10.6) 上,具有
./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
带有-t, --time-format
. - 时间可以是机器的本地时间(默认情况下)或 UTC 时间
-u, --utc-time
。
Getting fsw:
获取 fsw:
fsw
is hosted on GitHuband can be obtained cloning its repository:
fsw
被托管在GitHub上,可以得到克隆其存储库:
git clone https://github.com/emcrisostomo/fsw
Installing fsw:
安装 fsw:
fsw
can be installed using the following commands:
fsw
可以使用以下命令安装:
./configure && make && sudo make install
Further information:
更多信息:
I also wrote an introductory blog postwhere you can find a couple of examples about how fsw
works.
我还写了一篇介绍性博客文章,您可以在其中找到几个有关fsw
工作原理的示例。
回答by Steven Lu
My fork of fswatchprovides the functionality of inotifywait -m
with slightly less (no wait, more! I have a lot more troubles on Linux with inotifywait
...) parse-friendly output.
我的fswatch 分支提供了inotifywait -m
稍微少一些的功能(不用等待,更多!我在 Linux 上有更多的麻烦inotifywait
......)解析友好的输出。
It is an improvement upon the original fswatch
because it sends out the actual path of the changed file over STDOUT rather than requiring you to provide a program that it forks.
它是对原始fswatch
文件的改进,因为它通过 STDOUT 发送已更改文件的实际路径,而不是要求您提供它分叉的程序。
It's been rock solid as the foundation of a series of scary bash scripts I use to automate stuff.
作为我用来自动化操作的一系列可怕的 bash 脚本的基础,它坚如磐石。
(this is off-topic) inotifywait
on Linux, on the other hand, requires a lot of kludges on top of it and I still haven't figured out a good way to manage it, though I think something based on node.js
might be the ticket.
(这是题外话)inotifywait
另一方面,在 Linux 上需要很多杂物,我仍然没有想出一个很好的方法来管理它,尽管我认为基于的东西node.js
可能是票证。
回答by Asaph
Apple OSX Folder Actionsallow you to automate tasks based on actions taken on a folder.