Bash脚本监视文件更改并执行命令


12

我有一个带有一堆子文件夹的文件夹,这些文件夹的asciidoctor格式带有.adoc扩展名。

每次更改文件时(经常),我都需要运行

asciidoctor -q filename.adoc

将其编译为HTML格式。

我正在尝试使过程自动化。到目前为止,我已经使用entr来实现了:

ls *.adoc | entr asciidoctor -q *.adoc

但仅适用于现有文件夹,不适用于子文件夹。我已经尝试了这种变体,但没有用:

find . -name '*.adoc' | entr asciidoctor -q *.adoc

有什么想法可以实现所有子文件夹的自动化过程吗?


Answers:


17

Linux提供了一个不错的界面来监视所有文件系统事件,例如创建,修改,删除文件。该接口是inotify系统调用的集合,利用这些调用的用户空间实用程序由inotify-toolsUbuntu中的软件包提供(可在Universe存储库中找到)。如果尚未安装,请通过以下方式安装:

sudo apt-get install inotify-tools

inotify-tools提供inotifywaitinotifywatch二进制文件,我们需要第一个。


因此,您想在修改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事件感兴趣,即文件被修改时。其他可能的值包括openclose等等。

  • --format %w,我们只希望修改的文件名而不是其他信息,因为我们将使用文件名作为另一个命令的输入

  • /foo/bar/*.adoc将扩大到所有.adoc在文件/foo/bar目录


现在,上面的代码将显示修改后的文件名,现在可以在文件名上运行命令(假定命令通过STDIN接受参数):

inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc | asciidoctor -q

您还可以在目录上设置递归监视,然后只需要使用grep来过滤所需的文件。在此处,递归地将监视设置为(-r)目录,/foo/bargrep用于仅过滤.adoc文件:

inotifywait -qrm --event modify --format '%w%f' /foo/bar | grep '\.adoc$' | asciidoctor -q

在查看目录时,输出格式说明符%w解析为目录名,因此我们需要%f获取文件名。在观看文件时,%f将解析为空字符串。

请注意,您还可以inotifywait在守护程序(-d)模式下运行,还可以编写整个脚本,和/或在后台运行,和/或使用其他更多选项。

另外,如果需要,可以用asciidoctor您选择的任何其他命令替换。

检查man inotifywait以获得更多想法。


谢谢它的工作。对于OSX,我也有类似的东西。但是我想这不是问的正确地方。
bran

@bran是的,恕我直言,请转到UL,您可以以此为参考。
heemayl

很好的答案,只需稍作纠正。-q使程序“不太冗长”,-qq(双q)使程序完全静音,除了致命错误。
jotadepicas

4

使用inotifywait是典型的方法,但是还有一个单独的实用程序inotify-hookable,用于在文件(或目录)更改时运行命令:

inotify-hookable -f filename.adoc -c 'asciidoctor -q filename.adoc'

一次触发命令后似乎退出;我看不到继续观看的选项,因此您可以执行以下操作:

while true; do
    inotify-hookable -f filename.adoc -c 'asciidoctor -q filename.adoc'
    echo "== $(date) : executed, continuing to monitor..."
done

请注意,有一些选项可以递归监视多个文件或目录,还有一些选项可以忽略文件/路径。


在为我运行命令后,inotify-hookable不会退出。嗯
最高

inotify-hookable是通过其他软件包安装的:sudo apt-get install inotify-hookable
Bruno Silvano,

3

有很多工具,特别是如果您在存储库中搜索时

apt-cache search monitor | grep file

这给了我们很多工具。但是您不必测试它们,因为我这样做了。

我已经测试了这些工具和许多其他工具:

  • 声化
  • fswatch
  • 文件监视
  • 色板
  • 文件已更改
  • 输入

在这些工具中,我发现其中三个有用且可靠:

  • direvent | 用C编写的GNU
  • iwatch | 在Perl
  • 狙击手

在这三个之间,毫无疑问,直接事件是最好的。

使用它是如此有用和可靠,以至于我将其用于我的微服务的简单管道中。

direvent.conf 观看文件

syslog {
    facility local0;
    tag "direvent";
    print-priority yes;
}

watcher {
    path /var/www/html/ir/jsfun/build/react recursive;
    file "*.js";
    event write;
    command "/usr/bin/xdotool search --onlyvisible  --class firefox key F5";
    option (stdout, stderr, wait);
}

这只是我拥有的配置文件之一,只要有写入更改,就会执行此命令-也可能是脚本。

无需使用while循环或其他东西。


特征

  • 递归地查看目录
  • 可以作为守护程序在前台后台运行
  • 便携式的。我在Ubuntu和CentOS7服务器中都拥有它
  • 文件名报告
  • 正则表达式以支持文件匹配
  • 多文件观看(观看多于一种文件)
  • 同步命令执行(如果我们有多观察者)
  • syslog处理(如果需要,请登录到syslog)
  • 简单易用的CLI和配置文件设计

Sergey Poznyakoff开发。


正在安装

sudo apt install direvent

但是使用其源代码进行安装非常容易和直接,这为您提供了最新版本(目前为:5.1)。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.