ファイルの変更を監視してコマンドを実行するBashスクリプト


12

サブフォルダーがたくさんあるフォルダーがありますが、これらのフォルダーは拡張子asciidoctor付きのファイル形式になっています.adoc

ファイルに変更を加えるたびに(多くの場合)、実行する必要があります

asciidoctor -q filename.adoc

HTML形式にコンパイルします。

プロセスを自動化しようとしています。これまでのところ、entrを使用してこれが付属しています。

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

ただし、既存のフォルダでのみ機能し、サブフォルダでは機能しません。私はこのバリエーションを試しましたが、うまくいきません:

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

この自動化プロセスをすべてのサブフォルダーに実装する方法はありますか?


回答:


17

Linuxは、ファイルの作成、変更、削除など、すべてのファイルシステムイベントを監視するための優れたインターフェイスを提供します。インターフェイスはinotifyシステムコールのファミリであり、これらのコールを利用するユーザースペースユーティリティはinotify-tools、Ubuntu のパッケージ(ユニバースリポジトリで入手可能)によって提供されます。まだインストールしていない場合は、次の方法でインストールします。

sudo apt-get install inotify-tools

inotify-tools提供しinotifywaitinotifywatchバイナリ、私たちは最初のものを必要としています。


したがってasciidoctor -q some_file.adocファイルが変更されたときにコマンドが実行されるようにします(そのファイルsome_fileに置き換えられます)。その場合、.adocファイルがdirectory /foo/barにあると想定して、監視を設定できます。

inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc
  • -qクワイエットモードを有効にし、inotifywaitそれ自体からの情報はありません

  • -m 監視モードを有効にします。それ以外の場合は、最初のイベントの後に終了します

  • --event modifymodifyイベントにのみ関心があります。つまり、ファイルが変更されたときです。その他の可能な値にはopencloseなどがあります。

  • --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空の文字列に解決されます。

、あなたも実行できることを注意inotifywaitデーモン(中-d)モードのことができます。また、スクリプト全体のこと、および/またはバックグラウンドで実行、および/またはそれ以上の他のオプションを使用してプレイ。

また、必要にasciidoctor応じて、任意の他のコマンドに置き換えることができます。

man inotifywaitより多くのアイデアを得るためにチェックしてください。


うまくいきました。OSXについても同様です。でも、これは尋ねるには適切な場所ではないと思います。
ふすま

@branはい、私見はULに行きます。これを参照として使用できます。
heemayl

すばらしい答えです。ほんの小さな修正です。-qを指定すると、プログラムは「冗長ではなくなり」、-qq(ダブルq)を指定すると、致命的なエラーを除いて完全にサイレントになります。
jotadepicas

4

を使用するのinotifywaitが一般的な方法ですがinotify-hookable、ファイル(またはディレクトリ)が変更されたときにコマンドを実行できるという、別のユーティリティもあります。

inotify-hookable -f filename.adoc -c 'asciidoctor -q filename.adoc'

コマンドを1回トリガーした後、終了するようです。連続監視のオプションが表示されないので、次のようなことができます。

while true; do
    inotify-hookable -f filename.adoc -c 'asciidoctor -q filename.adoc'
    echo "== $(date) : executed, continuing to monitor..."
done

複数のファイルまたはディレクトリを再帰的に監視するオプションと、ファイル/パスを無視するオプションがあることに注意してください。


コマンドを実行した後、inotify-hookableが終了しません。うーん
最大

inotify-hookableは別のパッケージからインストールされます:sudo apt-get install inotify-hookable
Bruno Silvano

3

特にリポジトリを検索する場合、そこには多くのツールがあります

apt-cache search monitor | grep file

多くのツールを提供します。しかし、私がそれをしたので、それらをテストする必要はありません。

私はこれらのツールと他の多くのツールをテストしました:

  • inotify
  • fswatch
  • ファイルウォッチ
  • 見本
  • ファイルが変更されました
  • entr

これらのツールの中で、そのうちの3つは便利で信頼できるものでした。

  • direvent | Cで書かれたGNU
  • iwatch | Perlで
  • fsniper

そして、これらの3の間、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

さて私は以下をお勧めします。

#!/bin/bash
#Script
for SRC in *.adoc; 
      do
      asciidoctor -q $SRC
  done

1
OPは、変更が行われた場合にのみコマンドを実行したいと考えています
。– heemayl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.