Linux提供了一个不错的界面来监视所有文件系统事件,例如创建,修改,删除文件。该接口是inotify
系统调用的集合,利用这些调用的用户空间实用程序由inotify-tools
Ubuntu中的软件包提供(可在Universe存储库中找到)。如果尚未安装,请通过以下方式安装:
sudo apt-get install inotify-tools
inotify-tools
提供inotifywait
和inotifywatch
二进制文件,我们需要第一个。
因此,您想在修改asciidoctor -q some_file
任何.adoc
文件时运行该命令(some_file
将替换为该命令),如果是这样,那么假设您的.adoc
文件位于目录中/foo/bar
,则可以设置监视:
inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc
-q
启用安静模式,inotifywait
自身无任何信息
-m
启用监视器模式,否则它将在第一个事件后退出
--event modify
,我们只对modify
事件感兴趣,即文件被修改时。其他可能的值包括open
,close
等等。
--format %w
,我们只希望修改的文件名而不是其他信息,因为我们将使用文件名作为另一个命令的输入
/foo/bar/*.adoc
将扩大到所有.adoc
在文件/foo/bar
目录
现在,上面的代码将显示修改后的文件名,现在可以在文件名上运行命令(假定命令通过STDIN接受参数):
inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc | asciidoctor -q
您还可以在目录上设置递归监视,然后只需要使用grep
来过滤所需的文件。在此处,递归地将监视设置为(-r
)目录,/foo/bar
并grep
用于仅过滤.adoc
文件:
inotifywait -qrm --event modify --format '%w%f' /foo/bar | grep '\.adoc$' | asciidoctor -q
在查看目录时,输出格式说明符%w
解析为目录名,因此我们需要%f
获取文件名。在观看文件时,%f
将解析为空字符串。
请注意,您还可以inotifywait
在守护程序(-d
)模式下运行,还可以编写整个脚本,和/或在后台运行,和/或使用其他更多选项。
另外,如果需要,可以用asciidoctor
您选择的任何其他命令替换。
检查man inotifywait
以获得更多想法。