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/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、、filewatchswatchfileschanged、 そしてentr

これらのツールの中で、私は次の 3 つが便利で信頼できると感じました。

そしてこの3つから、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);
}

これは私が持っている設定ファイルの1つで、変更があるたびに書くこのコマンドが実行されます。これはスクリプトも同様です。

whileループやその他のものを使用する必要はありません。


特徴

  • ディレクトリを再帰的に監視する
  • 実行できる前景または背景デーモンとして
  • ポータブル。UbuntuとCentOS7サーバーにインストールしています
  • ファイル名レポート
  • ファイルマッチングをサポートする正規表現
  • 複数ファイルの監視(1 種類以上のファイルを監視)
  • コマンド実行を同期する(マルチウォッチャーがある場合)
  • syslog 処理 (必要に応じて syslog にログを記録する)
  • 使いやすく優れた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

関連情報