多数のサブフォルダーがあるフォルダーがあります。これらのフォルダーには、.adoc
拡張子でasciidoctor
形式のファイルがあります。
ファイルを変更するたびに(多くの場合)、実行する必要があります
asciidoctor -q filename.adoc
hTML形式にコンパイルします。
プロセスを自動化しようとしています。これまでのところ、私は entr を使用してこれを実現しています:
ls *.adoc | entr asciidoctor -q *.adoc
ただし、既存のフォルダーでのみ機能し、サブフォルダーでは機能しません。私はこのバリエーションを試しましたが、うまくいきません:
find . -name '*.adoc' | entr asciidoctor -q *.adoc
すべてのサブフォルダーにこの自動化プロセスを実装する方法はありますか?
Linuxは、ファイルの作成、変更、削除など、すべてのファイルシステムイベントを監視するための素晴らしいインターフェイスを提供します。インターフェースはシステムコールのinotify
ファミリーです。これらのコールを活用するユーザースペースユーティリティは、Ubuntuのinotify-tools
パッケージ(ユニバースリポジトリで利用可能)によって提供されます。まだお持ちでない場合は、次の方法でインストールしてください。
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
はQuietモードを有効にし、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 | asciidoctor -q
ディレクトリで再帰監視を設定することもできます。その場合は、grep
を使用して必要なファイルのみをフィルタリングする必要があります。ここで、ディレクトリ-r
で時計を再帰的に設定(/foo/bar
)し、grep
を使用して.adoc
ファイルのみをフィルタリングします。
inotifywait -qrm --event modify --format '%w%f' /foo/bar | grep '\.adoc$' | asciidoctor -q
ディレクトリを監視する場合、出力形式指定子%w
はディレクトリ名に解決されるため、ファイル名を取得するには%f
が必要です。ファイルの監視中、%f
は空の文字列に解決されます。
デーモン(-d
)モードでinotifywait
を実行したり、スクリプト全体を実行したり、バックグラウンドで実行したり、他のオプションを使用したりすることもできます。
また、必要に応じて、asciidoctor
を任意の他のコマンドに置き換えることができます。
man inotifywait
をチェックして、より多くのアイデアを得てください。
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
複数のファイルまたはディレクトリを再帰的に監視するオプションと、ファイル/パスを無視するオプションがあることに注意してください。
特にリポジトリを検索する場合は、多くのツールがあります
apt-cache search monitor | grep file
多くのツールを提供します。しかし、私がそれをしたので、それらをテストする必要はありません。
これらのツールや他の多くのツールをテストしました。
これらのツールの中で、そのうち3つが便利で信頼性が高いことがわかりました。
そして、これら3つの間で、 direvent が間違いなく最高です。
使用すると非常に便利で信頼できるので、自分のマイクロサービスで単純なpipelineに使用しました。
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);
}
これは、writeに変更があるたびに、このコマンドが実行される設定ファイルの1つにすぎません。これは bash スクリプトも同様です。
while
ループなどを使用する必要はありません。
Sergey Poznyakoff によって開発されました。
Sudo apt install direvent
しかし、そのソースコードを使用してインストールするのは非常に簡単で簡単で、最後のバージョンが得られます(現在は5.1です)。