Linuxでファイルが変更されたときにコマンドを実行する方法は?
公開: 2022-04-04作業ディレクトリ内のファイルが変更されたとき、および新しいファイルが作成されたときに Linux コマンドを実行する方法を学びたい場合は、適切な場所に来ました。
Linux では、 cron
を使用して、特定の時間にコマンドを実行するようにスケジュールできます。
しかし、ファイルが変更されるたび、または新しいファイルがディレクトリに追加されるたびにコマンドを実行する必要がある場合はどうでしょうか?
これも簡単に実現でき、それを実行するためのコマンドライン ツールがいくつかあります。
始めましょう!
ウォッチエグゼクティブ
watchexec
は、特定の作業ディレクトリを監視し、ファイルの更新や新しいファイルの作成などの変更を検出した場合にコマンドを実行する便利なスタンドアロン ツールです。
特徴
xargs
(拡張引数) を含む複雑なコマンド ラインは必要ありません。- 現在のディレクトリとすべてのサブディレクトリの変更をリアルタイムでチェックします。
- 言語ランタイムは必要なく、特定の言語やエコシステムに接続されていません。
- .gitignoreと.ignoreは、通知を無視するファイルを決定するためにデフォルトで使用されます。
- プロセス グループは、fork プログラムを追跡するために使用されます。
- 特定の拡張子を持つファイルの監視がサポートされています。
- OS X、Linux、および Windows と互換性があります。
- グロブに基づくイベントのフィルタリングと無視 (部分的に同一のファイル名を見つけるためのファイル検索パターンが可能です。
watchexec のインストール
watchexec
ツールを簡単にインストールするには、次のリンクをターミナルまたはシェル プロンプトに貼り付けて、Enter キーを押します。
Linux と macOS
curl -sS https://webinstall.dev/watchexec | bash
インストールが成功すると、パスが画面に表示されます。 私の場合、このツールは/root/.local/bin
にインストールされていました
┌──(rootkali)-[~] └─# curl -sS https://webinstall.dev/watchexec | bash Thanks for using webi to install 'watchexec@stable' on 'Linux/x86_64'. Have a problem? Experience a bug? Please let us know: https://github.com/webinstall/webi-installers/issues Lovin' it? Say thanks with a Star on GitHub: https://github.com/webinstall/webi-installers Found /root/Downloads/webi/watchexec/cli-v1.18.9/watchexec-1.18.9-x86_64-unknown-linux-musl.tar.xz Extracting /root/Downloads/webi/watchexec/cli-v1.18.9/watchexec-1.18.9-x86_64-unknown-linux-musl.tar.xz Installing to /root/.local/opt/watchexec-vcli-v1.18.9/bin/watchexec Installed 'watchexec vcli-v1.18.9' as /root/.local/bin/watchexec
インストール後、 .local/bin
リポジトリに移動し、これらのコマンドを使用してファイルが存在するかどうかを確認します。
cd .local/bin ls
次のステップは、 watchexecツールを使用するためのパスをエクスポートすることです。
export PATH="/root/.local/bin:$PATH"
実行するには、ターミナルで root ユーザーとしてwatchexec
と入力するだけです。 このコマンドを使用して、watchexec ツールで使用できるフラグとオプションを確認します。
watchexec --help
コマンド例
- このディレクトリ/サブディレクトリでファイルが変更された場合は、
ls -la
を呼び出します。 このコマンドは、変更が検出されるたびに、ディレクトリに存在するすべてのファイルを表示します。
watchexec -- ls -la
- 現在のディレクトリ内の python、js、CSS、または Html 拡張ファイルのいずれかが変更されるたびに、コマンドを実行します。 ここでは、任意のコマンドを渡すことができます。 ファイル拡張子はコンマで区切る必要があります。
watchexec --exts py,js,css,html <command>
-
lib
またはsrc
内のファイルが変更されたときにコマンドを実行します。 「-w」オプションは、システム内の特定のファイルまたはディレクトリを監視します。
watchexec -w lib -w src <command>
- 現在のディレクトリ (およびすべてのサブディレクトリ) 内のファイルが変更されたときに、任意のサービスを呼び出して再起動します。
watchexec -e html -r tor watchexec -e js,py -r mysql
ここで、「-r」オプションは、システムで実行されている場合、プロセスまたはサービスを再起動します。

その他の watchexec の使用例については、公式の GitHub リポジトリにアクセスしてください。
入力
entr
は、特定のディレクトリで変更が発生したときに任意のコマンドを実行するためのシンプルで優れたコマンドライン ユーティリティです。
「 entr 」はEvent Notify Test Runnerの略です。 このツールは、迅速なフィードバックと自動テストを行うことを目的として作成されました。
インストール
entr
は Linux ディストリビューションにプリインストールされています。 見つからない場合は、手動でインストールする必要があります。
このツールは使いやすく、次のコマンドでインストールできます。
sudo apt-get install entr
または、公式の Git リポジトリを複製してインストールすることもできます。
git clone https://github.com/eradman/entr.git
次に、そのディレクトリに移動し、以下のコマンドを使用して要件をインストールします。
./configure make test make install
利用可能なビルド オプションを表示するには、 ./configure -h
を実行します。
コマンド例
entr
コマンドで使用できるオプションと引数を確認します。 次のコマンドを使用します。
man entr
このコマンドは、 entr
コマンドのユーザー マニュアルを表示します。
NAME entr — run arbitrary commands when files change SYNOPSIS entr [-acdnprsz] utility [argument /_ ...] DESCRIPTION A list of files provided on standard input, and the utility is executed using the supplied arguments if any of them change. entr waits for the child process to finish before responding to subsequent file system events. A TTY is also opened before entering the watch loop in order to support interac‐ tive utilities. The arguments are as follows: -a Respond to all events which occur while the utility is running. Without this option, entr consolidates events in order to avoid looping. This option has no effect in conjunction with the -r flag. -c Clear the screen before invoking the utility specified on the command line. Specify twice to erase the scroll back buffer. -d Track the directories of regular files provided as input and exit if a new file is added. This option also enables directories to be specified explicitly. If specified twice, all new entries to a directory are recognized, otherwise files with names beginning with '.' are ig‐ nored. -n Run in non-interactive mode. In this mode entr does not attempt to read from the TTY or change its properties. -p Postpone the first execution of the utility until a file is modified. Manual page entr(1) line 1 (press h for help or q to quit)
- 作業ディレクトリで JavaScript ファイルが変更されたときに、MySQL サーバーを起動して自動再ロードします。 変更がファイルに保存されるたびに、
entr
は MySQL サーバーをリロードします。
ls *.js | entr -r mysql
- Web サーバーを自動リロードするか、サーバーが終了した場合は終了します。
$ ls * | entr -rz ./httpd
entr
コマンドの詳細と例については、公式の GitHub リポジトリにアクセスしてください。
最後の言葉
この記事が、特定のディレクトリ内のファイルが変更されたとき、および新しいファイルが作成されたときに Linux コマンドを実行する方法を学ぶのに非常に役立つことを願っています。
Linux でファイルとディレクトリを削除する方法を学ぶことにも興味があるかもしれません。