TOC
fswatch 的基础使用
fswatch 和其他命令连用
hello fswatch
fswatch 可以用来监测一个 path 下的文件变动事件。
最简单的 fswatch .
:
$ fswatch .
/Users/clip/test/fswatch/hello
/Users/clip/test/fswatch/hello-fswatch
/Users/clip/test/fswatch/hello-fswatch
/Users/clip/test/fswatch/hello-fswatch
上面的几行输出分别是在下面的新建、编辑、删除操作之后产生的。
$ touch hello
$ touch hello-fswatch
$ echo hhh > hello-fswatch
$ rm hello-fswatch
与其他程序连用
用时候想在检测到文件变动之后执行某些操作,比如检测到变化之后触发 rsync 来同步文件。
0.x 版本的时候 fswatch 支持 fswatch path [paths] program
,但是 1.x 的时候因为一些原因取消了这个支持,这样可以用 pipe 来实现同样的效果。
$ fswatch -0 [opts] [paths] | xargs -0 -n 1 -I {} [command]
另外为了适配之前的用法,一般安装 fswatch 的时候都会附加一个 fswatch-run 的 script,关键内容如下:
fswatch -o ${=*[1,-2]} | xargs -n1 -I{} ${=*[-1,-1]}
其实就是把 fswatch-run 接受的最后一个参数前的所有参数交给 fswatch 作为 path,剩下的最后一个参数交给 xargs 来执行。
fswatch 的 -o
使得输出只是一个代表文件变化数的数字,${=*[1,-2]}
则是指的所有参数(*
)的第一到倒数第二个([1,-2]
)。
xargs 本来是把从标准输入的内容当做参数来用,但其实这里它并没有这么做,首先 -n 1
已经只接受一个参数,然后 -I{}
又把唯一的一个参数给替换成空的了,最后 ${=*[-1,-1]}
来执行最后的一个参数。附上 shell args op 的小实验。
假设自己有自定义的需求也可以对应的去做一些修改,比如像这么用:
$ fswatch-run ~/dev/xxx rsync-to-dev ~/dev/xxx /home/xxx/project/xxx/
那么就可以自己写一个 fswatch-run:
fswatch -o ${=*[1,2]} | xargs -n1 -I{} ${=*[2,-1]}
参考: