
たくさんのサブフォルダーを含むフォルダーがあり、これらのフォルダーは拡張子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
。
これらのツールの中で、私は次の 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