GNU/Linux >> Linux の 問題 >  >> Linux

ファイルが変更されるたびにコマンドを実行する方法は?

シンプル、inotifywait を使用 (ディストリビューションの inotify-tools をインストール) パッケージ):

while inotifywait -e close_write myfile.py; do ./myfile.py; done

または

inotifywait -q -m -e close_write myfile.py |
while read -r filename event; do
  ./myfile.py         # or "./$filename"
done

最初のスニペットはより単純ですが、重大な欠点があります:inotifywait の間に実行された変更が失われます。 実行されていない (特に myfile の間) が走っています)。 2 番目のスニペットには、この欠陥はありません。ただし、ファイル名に空白が含まれていないと想定していることに注意してください。それが問題になる場合は、--format を使用してください ファイル名を含めないように出力を変更するオプション:

inotifywait -q -m -e close_write --format %e myfile.py |
while read events; do
  ./myfile.py
done

いずれにせよ、制限があります:一部のプログラムが myfile.py を置き換える場合 既存の myfile に書き込むのではなく、別のファイルで 、 inotifywait 死んでしまいます。多くの編集者はそのように働いています。

この制限を克服するには、inotifywait を使用します ディレクトリ:

inotifywait -e close_write,moved_to,create -m . |
while read -r directory events filename; do
  if [ "$filename" = "myfile.py" ]; then
    ./myfile.py
  fi
done

あるいは、incron (ファイルが変更されたときにイベントを登録できるようにする) や fswatch (Linux の inotify の各バリアントのアナログを使用して、他の多くの Unix バリアントでも動作するツール) など、同じ基本機能を使用する別のツールを使用します。 /P>

エントリー (http://entrproject.org/) は、inotify へのより使いやすいインターフェイスを提供します (また、*BSD および Mac OS X もサポートします)。

監視する複数のファイルを非常に簡単に指定できます (ulimit -n によってのみ制限されます)。 )、置き換えられるファイルを処理する手間が省け、必要な bash 構文が少なくなります:

$ find . -name '*.py' | entr ./myfile.py

現在変更中のコードの単体テストを実行するために、プロジェクト ソース ツリー全体でこれを使用しており、すでにワークフローが大幅に向上しています。

-c のようなフラグ (実行間で画面をクリア) と -d (監視対象のディレクトリに新しいファイルが追加されたときに終了します) さらに柔軟性を追加します。たとえば、次のことができます:

$ while sleep 1 ; do find . -name '*.py' | entr -d ./myfile.py ; done

2018 年の初めの時点で、まだ活発に開発されており、Debian および Ubuntu (apt install entr) で見つけることができます。 );著者のリポジトリからのビルドは、いずれにせよ簡単でした。


when-changed と呼ばれるまさにこれを行う Python プログラムを作成しました。

使い方は簡単です:

when-changed FILE COMMAND...

または、複数のファイルを見るには:

when-changed FILE [FILE ...] -c COMMAND

FILE ディレクトリにすることができます。 -r で再帰的に見る . %f を使用 ファイル名をコマンドに渡します。


Linux
  1. Linuxでコマンド出力をファイルに保存する方法

  2. ファイルのサブセットをランダムにサンプリングする方法は?

  3. Linuxでpythonファイルを実行する方法

  1. ファイルが見つかった場所でコマンドを実行しますか?

  2. ファイルの存在を確認し、存在しない場合はコマンドを実行するにはどうすればよいですか?

  3. 出力をファイルに追加する方法は?

  1. ファイルの部分チェックサムを生成する方法

  2. 端末でテキスト ファイルを編集する方法

  3. LinuxでPLファイルを実行するには?