我想在我的Mac上监视一个文件夹,然后执行一个bash脚本,将刚刚移动到或在监视目录中创建的任何文件/文件夹的名称传递给它。
当前回答
我有一个关于这个的主旨,用法很简单
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开启verbose模式,显示调试信息 -q使监视文件安静地执行(将显示#,以便用户可以看到程序正在执行) -qq使监视文件完全安静地执行 -h显示帮助和用法
https://gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55
其他回答
Facebook的看门人(watchman)在Homebrew上也很好用。它还支持过滤:
这两行代码在源目录上建立一个监视,然后进行设置 在名为buildme的触发器上运行一个名为miniify -css的工具 每当CSS文件被更改时。工具将被传递一个列表 改变文件名。 $ watchman watch ~/src $ watchman—trigger ~/src buildme '*.css'—mini -css
注意,路径必须是绝对的。
福斯沃琪
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
注意:如果没有-I{}, -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.
看门狗是一个跨平台的python API,用于监视文件/目录,它有内置的“诡计”工具,允许您在事件发生时触发动作(包括shell命令)(包括新添加的文件,删除的文件和更改的文件)。
您可能想看一看(或者扩展一下)我的小工具kqwait。目前它只是坐在那里等待单个文件上的写事件,但是kqueue架构允许分层事件堆叠…
你可以使用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,运行:
$ launchctl unload ~/Library/LaunchAgents/logger.plist
上面的配置文件使用WatchPaths选项。或者,您也可以使用 QueueDirectories选项。有关更多信息,请参阅启动手册页。
推荐文章
- 在Mac上安装R -警告消息:设置LC_CTYPE失败,使用“C”
- 为什么cURL返回错误“(23)Failed writing body”?
- 节点和错误:EMFILE,打开的文件太多
- 如何使用命令行工具为Mac OS X创建一个漂亮的DMG ?
- 由于环境错误无法安装包:[Errno 13]
- Mac压缩没有__MACOSX文件夹?
- 如何复制一个选择到OS X剪贴板
- 如何在Mac上设置我的默认shell,例如Fish?
- "ERROR:root:code for hash md5 was not found"当使用任何hg mercurial命令时
- Linux相当于Mac OS X的“open”命令
- 如何在Mac上的命令行安装JQ ?
- 在Mac OS X上安装/升级gradle
- 如何在终端中提高光标速度?
- Objective-C中的自动引用计数不能防止或减少什么样的泄漏?
- 如何在Mac OS安装时停止MySQL ?