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

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

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

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

asciidoctor -q filename.adoc

将其编译为 HTML 格式。

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

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

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

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

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

答案1

在您开始进行更改之前,我建议您制作时间戳,例如

touch time.stamp.file

编辑后,您可以通过以下方式找到所有更改的文件

find . -name '*.adoc' -newer time.stamp.file -exec asciidoctor -q {} +

答案2

  1. 搜索“*.adoc”文件
  2. 测试 filename.adoc 是否比 filename.html 新
  3. 如果是这样,请对其运行 asciidoctor

    find . -name '*.adoc' | while read FILE; do [ "${FILE}" -nt "${FILE%adoc}html" ] && asciidoctor -q "${FILE}" ; done
    

或放入脚本:

#! /bin/bash
find . -name '*.adoc' | while read FILE; do
    if [ "${FILE}" -nt "${FILE%adoc}html" ]; then
        asciidoctor -q "${FILE}"
    fi
done

一行或脚本可以从 crontab 每分钟运行一次:

crontab -e

添加一行

* * * * * /home/joe/update_adoc.bash

答案3

这可以通过使用开源工具来完成monit

让我们添加以下内容/etc/monit.conf

check file test with path /path/tp/test
    if changed checksum then exec "/bin/bash /path/to/script.sh" as uid a_user_id and gid a_group_id


我们应该确保具有a_user_idas 的用户id有足够的权限来
/path/to/test文件和
读取、执行权限,/path/to/script.sh

当我们将monit.conf
then 更改为 root 时:

monit reload 

获取更改monit daemon

watch monit status 

monit触发事件时可以显示报告中的更改

例如,在此示例中,
当我们更改文件的内容时,/path/to/test将调用 /path/to/script.sh 脚本。

默认情况下,monit每 30 秒唤醒一次并执行配置的检查

要检查添加到目录的新文件或目录中的文件是否发生更改:

check directory test2 with path /path/to<br/>
      if changed timestamp then exec "/bin/bash /path/to/script.sh" as uid a_user_id and gid a_group_id

我相信可以轻松更新此配置以满足您的应用程序的需求!

相关内容