我想看我的Mac(雪豹)的文件夹,然后执行一个脚本(给它什么刚搬进一个文件夹中的文件名(作为参数...... x.sh“文件名”))。
我有一个脚本都在bash(x.sh)写上去,将移动输入$ 1 I只需要OSX给我的文件名时,新的文件/文件夹移动/创建成目录的一些文件和其他的东西。
任何这样的命令?
我想看我的Mac(雪豹)的文件夹,然后执行一个脚本(给它什么刚搬进一个文件夹中的文件名(作为参数...... x.sh“文件名”))。
我有一个脚本都在bash(x.sh)写上去,将移动输入$ 1 I只需要OSX给我的文件名时,新的文件/文件夹移动/创建成目录的一些文件和其他的东西。
任何这样的命令?
fswatch是使用Mac OS X FSEvents API监测目录的小程序。 当接收到任何关于变化到该目录的事件时,指定的外壳命令由执行/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
注:输出数
-o
将被添加到年底xargs
如果不是命令的-I{}
如果你选择使用该号码,地点{}
在命令中的任何地方。
为0.X版本较旧的方式:
fswatch ~/path/to/watch ~/script/to/run/when/files/change.sh
截至13年9月12日它被添加回以自制 -耶! 因此,更新您的公式列表( 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用于这一目的。 的launchd可以被配置为当一个文件路径被修改以自动启动的程序。
例如,下面的launchd配置的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文件夹中Library文件夹为“logger.plist”。
从贝就可以使用命令launchctl
通过运行激活logger.plist:
$ launchctl load ~/Library/LaunchAgents/logger.plist
桌面文件夹现在已经被监控。 每当它改变你应该看到在SYSTEM.LOG输出(使用Console.app)。 要停用logger.plist,运行:
$ launchctl unload ~/Library/LaunchAgents/logger.plist
上面的配置文件使用WatchPaths
选项。 另外,您也可以使用QueueDirectories
选项。 见的launchd了解更多信息手册页。
Facebook的守望者 ,通过自制可用,也看起来不错。 它也支持过滤:
这两条线建立在源目录中的手表,然后又成立了一个名为“buildme”将运行一个名为“缩小CSS的”每当一个CSS文件被更改工具触发。 该工具会通过改变文件名列表。
$ watchman watch ~/src
$ watchman -- trigger ~/src buildme '*.css' -- minify-css
请注意,该路径必须是绝对的。
你可能想看看(也许扩大)我的小工具kqwait
。 目前,它只是坐在那里,等待对单个文件写事件,而kqueue的架构允许分层堆放事件...
看门狗是看文件/目录一个跨平台的Python API,它已内置“招数”的工具,它允许你触发动作(包括shell命令),当事件发生时(包括新添加的文件,删除文件和更改的文件)。
这仅仅是提ENTR作为OSX的替代文件时更改为运行任意命令。 我觉得它简单实用。
编辑: fsw
已并入fswatch
。 在这种应答,任何参考fsw
现在应该读fswatch
。
我写了一个fswatch
在C ++中称为替代fsw
设有几项改进:
这是它建立在任何支持平台上的GNU编译系统项目(OS X诉> = 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
。 -u, --utc-time
。 获取FSW:
fsw
是托管在GitHub上 ,可以得到克隆其存储库:
git clone https://github.com/emcrisostomo/fsw
安装FSW:
fsw
可以使用以下的命令安装:
./configure && make && sudo make install
更多的信息:
我也写了一个介绍性的博客文章 ,你可以找到一个关于如何几个例子fsw
作品。
下面是一个使用一个班轮sschober
的工具 。
$ while true; do kqwait doc/my_file.md; make; done
苹果OSX 文件夹操作 ,您可以根据一个文件夹上采取行动,自动执行任务。
我的叉子fswatch提供的功能inotifywait -m
略少(没有等待,更多!我有很多更多的麻烦在Linux上inotifywait
...)解析友好的输出。
它是在原来的改进fswatch
,因为它发出更改的文件在STDOUT的实际路径,而不是要求您提供它叉的程序。
它已经坚如磐石一系列我使用自动化的东西可怕的bash脚本的基础。
(这是题外话) inotifywait
在Linux上,而另一方面,需要在它上面的很多组装机的,我还没有想出一个好办法来管理它,但我认为基于什么node.js
可能是票。
我有一个GIST,这和使用是非常简单的
watchfiles <cmd> <paths...>
为了说明这一点,下面的命令将回显Hello World
每一次file1
或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
模式表示调试信息 -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
这里有一个简单的一行替代为没有谁的用户watch
的命令谁希望执行一个命令每3秒:
while :; do your-command; sleep 3; done
这是一个无限循环,基本上是一样执行以下操作:
watch -n3 your-command