作業ディレクトリ内のファイルが変更されたとき、または新しいファイルが作成されたときに Linux コマンドを実行する方法を学びたい場合は、ここが正しい場所です。
Linux では、
cron
を使用して、特定の時間にコマンドを実行するようにスケジュールできます。
しかし、ファイルが変更されるたび、または新しいファイルがディレクトリに追加されるたびにコマンドを実行する必要がある場合はどうすればよいでしょうか?
これも簡単に実現でき、それを実行するためのコマンドライン ツールがいくつかあります。
始めましょう!
ウォッチエグゼク
watchexec
は、特定の作業ディレクトリを監視し、ファイルの更新や新しいファイルの作成などの変更を検出した場合にコマンドを実行する便利なスタンドアロン ツールです。
特徴
-
xargs
(拡張引数) を含む複雑なコマンド ラインは必要ありません。 - 現在のディレクトリとすべてのサブディレクトリの変更をリアルタイムでチェックします。
- 言語ランタイムは必要なく、特定の言語やエコシステムに接続されていません。
- .gitignore と .ignore は、 通知を無視するファイルを決定するためにデフォルトで使用されます。
- プロセス グループは、フォークするプログラムを追跡するために使用されます。
- 特定の拡張子を持つファイルの視聴がサポートされています。
- OS X、Linux、Windows と互換性があります。
- glob に基づくイベントのフィルタリングと無視 (部分的に同一のファイル名を見つけるためのファイル検索パターンが可能)。
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 リポジトリ にアクセスしてください。
入る
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 でファイルとディレクトリを削除する方法を学習することにも興味があるかもしれません。