1

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]}

参考:


常伟佳
310 声望16 粉丝

引用和评论

0 条评论