direvent

direvent

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

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

asciidoctor -q filename.adoc

将其编译成 HTML 格式。

我正在尝试自动化这个过程。到目前为止,我已经使用进入

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

但仅适用于现有文件夹,不适用于子文件夹。我尝试过这种变体,但它不起作用:

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

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

答案1

Linux 提供了一个很好的界面来监控所有文件系统事件,例如创建、修改、删除文件。该界面是inotify系统调用系列,利用这些调用的用户空间实用程序由 Ubuntu 中的软件包提供inotify-tools(可在 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 | while read -r file ; do
    asciidoctor -q "$file"
done

您还可以在目录上设置递归监视,然后需要使用它来仅过滤所需的文件。这里在目录上grep设置递归监视( )并使用它仅过滤文件:-r/foo/bargrep.adoc

inotifywait -qrm --event modify --format '%w%f' /foo/bar | grep '\.adoc$' | while read -r file ; do
    asciidoctor -q "$file"
done

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

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

此外,如果您愿意,您可以asciidoctor用您选择的任何其他命令来替换。

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

答案2

有很多工具,特别是如果你搜索你的存储库

apt-cache search monitor | grep file

这给了我们很多工具。但你不必测试它们,因为我已经测试过了。

我已经测试过这些工具和许多其他工具:(inotifywait来自inotify-tools),fswatch,,filewatchswatchfileschanged, 和entr

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

从这三者中,direvent毫无疑问是最好的。

direvent

它非常有用和可靠,我已经用它做了一个简单的管道我已经拥有了微服务。

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 服务器上都有它
  • 文件名报告
  • 正则表达式支持文件匹配
  • 多文件监视(监视多种类型的文件)
  • 同步命令执行(如果我们有多个观察者)
  • 系统日志处理(如果需要,可以记录到系统日志)
  • 简单且良好的 CLI 和配置文件设计

由开发谢尔盖·波兹尼亚科夫


安装

sudo apt install direvent

但是使用其源代码安装它非常简单和直接,它会为您提供最新版本(现在是:5.1)。

答案3

使用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

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

答案4

那么我推荐以下内容。

#!/bin/bash
#Script
for SRC in *.adoc; 
      do
      asciidoctor -q $SRC
  done

相关内容