テクノロジー LINUX Linuxでファイルが変更されたときにコマンドを実行する方法は?

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

作業ディレクトリ内のファイルが変更されたとき、または新しいファイルが作成されたときに Linux コマンドを実行する方法を学びたい場合は、ここが正しい場所です。

Linux では、 cron を使用して、特定の時間にコマンドを実行するようにスケジュールできます。

しかし、ファイルが変更されるたび、または新しいファイルがディレクトリに追加されるたびにコマンドを実行する必要がある場合はどうすればよいでしょうか?

これも簡単に実現でき、それを実行するためのコマンドライン ツールがいくつかあります。

始めましょう!

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

ウォッチエグゼク

watchexec は、特定の作業ディレクトリを監視し、ファイルの更新や新しいファイルの作成などの変更を検出した場合にコマンドを実行する便利なスタンドアロン ツールです。

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

特徴

  • xargs (拡張引数) を含む複雑なコマンド ラインは必要ありません。
  • 現在のディレクトリとすべてのサブディレクトリの変更をリアルタイムでチェックします。
  • 言語ランタイムは必要なく、特定の言語やエコシステムに接続されていません。
  • .gitignore .ignore は、 通知を無視するファイルを決定するためにデフォルトで使用されます。
  • プロセス グループは、フォークするプログラムを追跡するために使用されます。
  • 特定の拡張子を持つファイルの視聴がサポートされています。
  • OS X、Linux、Windows と互換性があります。
  • glob に基づくイベントのフィルタリングと無視 (部分的に同一のファイル名を見つけるためのファイル検索パターンが可能)。
Linuxでファイルが変更されたときにコマンドを実行する方法は?
Linuxでファイルが変更されたときにコマンドを実行する方法は?

watchexecのインストール

watchexec ツールを簡単にインストールするには、次のリンクをターミナルまたはシェル プロンプトに貼り付け、Enter キーを押します。

Linux と macOS

 curl -sS https://webinstall.dev/watchexec | bash

インストールが成功すると、パスが画面に表示されます。私の場合、このツールは /root/.local/bin にインストールされました。

 ┌──(root💀kali)-[~]
└─# 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 リポジトリ にアクセスしてください。

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

入る

entr 、特定のディレクトリに変更が発生したときに任意のコマンドを実行するためのシンプルで優れたコマンドライン ユーティリティです。

entr 」は、 Event Notify Test Runne r を表します。このツールは、迅速なフィードバックと自動テストを行うことを目的として作成されました。

インストール

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 でファイルとディレクトリを削除する方法を学習することにも興味があるかもしれません。

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

「 Linuxでファイルが変更されたときにコマンドを実行する方法は?」についてわかりやすく解説!絶対に観るべきベスト2動画

【LPIC 101】Linuxコマンドを理解しようファイル操作編
【Linux技術動画】Linux基礎コマンド動画③(ユーザー切替、ファイル作成、権限変更編)