我有一个带有一堆子文件夹的文件夹,这些文件夹已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
提供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 | while read -r file ; do
asciidoctor -q "$file"
done
您还可以在目录上设置递归监视,然后需要使用它来仅过滤所需的文件。这里在目录上grep
设置递归监视( )并使用它仅过滤文件:-r
/foo/bar
grep
.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
,,filewatch
swatch
,
fileschanged
, 和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