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で1分ごとに1行またはスクリプトを実行できます。

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に対する十分な権限があることを確認し、rootに変更するときは、読み取りおよび実行権限があることを確認する必要があります。
/path/to/test
/path/to/script.sh

monit.conf

monit reload 

変更のインポートmonit daemon

watch monit status 

monitイベントがトリガーされると、レポートの変更が表示されることがあります。

たとえば、この例では、
ファイルの内容を変更すると、/path/to/test/ path / to / script.shスクリプトが呼び出されます。

デフォルトでは、monit30秒ごとに目覚め、設定されたチェックを実行します。

新しいファイルがディレクトリに追加されたか、ディレクトリ内のファイルが変更されたかどうかを確認するには、次の手順を実行します。

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

この構成は、アプリケーションのニーズに合わせて簡単に更新できると確信しています。

関連情報