ターミナルでSSH接続しているサーバー上で、ファイルの追加や削除をリアルタイムで確認したい場面に遭遇しました。
具体的には、AIコードエージェントが動作している最中に、どのファイルが作られ、どのファイルが消えていくのかを目で追いたかったのです。
1. 使用したコマンド(watchとtree)
通常、ディレクトリの内容を確認するにはlsコマンドを繰り返し実行します。
しかし、これでは変化を見逃してしまいます。
もっとスムーズに、画面を更新しながら監視できる方法はないか。
そう考えて試したのが、watchとtreeを組み合わせる方法でした。
watch -n 1 -d "tree -L 2"Code language: JavaScript (javascript)
このコマンドは、1秒ごとにtreeコマンドを実行し、ディレクトリ構造の変化をハイライト表示します。

監視を終了するには、 Ctrl+Cを押します。
すると通常のターミナル画面に戻ります。
1.1. watchコマンド:定期実行の仕組み
watchは、指定したコマンドを一定間隔で繰り返し実行し、その結果を画面に表示し続けるLinuxコマンドです1。
画面全体を使って表示するため、変化を追いやすいという特徴があります。
基本的な構文は次の通りです。
watch [オプション] コマンド
Code language: CSS (css)
もともとはUnix系システムで開発されたコマンドで、システム管理者がサーバーの状態を継続的に監視するために使われてきました。
たとえば、メモリ使用量やプロセスの状態を定期的にチェックする場合などです。
今回使用したオプションは2つです。
-n 1は実行間隔を1秒に設定します2。
デフォルトでは2秒間隔ですが、AIエージェントの動作は素早いため、より短い間隔にしました。この数字を変えることで、0.1秒単位での指定も可能です。-dは差分をハイライト表示するオプションです3。
前回の実行結果と比較して、変化した部分を反転表示します。
これにより、新しく追加されたファイルや削除されたファイルが一目でわかります。
1.2. treeコマンド:階層構造の可視化
treeは、ディレクトリの構造をツリー形式で表示するコマンドです4。lsと違い、サブディレクトリの内容も含めて視覚的に表現します。
基本的な使い方は、単にtreeと入力するだけです。
すると、カレントディレクトリ以下のすべてのファイルとディレクトリが、枝分かれした形で表示されます。
tree
実行すると、次のような出力が得られます。
.
├── src
│ ├── main.py
│ └── utils.py
├── tests
│ └── test_main.py
└── README.md
Code language: CSS (css)
よく使われるオプションには、以下のようなものがあります。
-Lオプションは表示する階層の深さを制限します。
今回は-L 2として、2階層までに限定しました。-dオプションはディレクトリのみを表示し、ファイルを省略します。
大規模なプロジェクトで構造を把握したいときに便利です5。-aオプションは隠しファイル(.で始まるファイル)も表示します。
設定ファイルなどを確認したい場合に使います6。
1.3. ダブルクォートの役割
コマンド全体を"tree -L 2"とダブルクォートで囲んでいます。これは、watchに対して「tree -L 2を1つのコマンドとして扱ってほしい」と伝えるためです。
クォートがないと、watchはtreeだけを監視対象と認識し、-L 2をwatch自身のオプションと誤解してしまいます。
シェルは空白でコマンドを区切るため、オプション付きのコマンドをwatchに渡す場合は、このようにクォートで囲む必要があります。
2. 必要なコマンドのインストール
このコマンドを使うには、watchとtreeの両方がシステムにインストールされている必要があります。
インストールされているか確認するには、次のコマンドを実行します。
watch --version
tree --version
それぞれのバージョン情報が表示されれば、正しくインストールされています。
macOSにはwatchコマンドが標準では含まれていません。
Homebrewを使ってインストールするのが一般的です7。
Homebrewは、macOSで最も広く使われているパッケージマネージャーです。
コマンドラインツールを簡単にインストール・管理できます。
なければ、まずはこれをインストールします。
Homebrewのインストール(未導入の場合)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Code language: JavaScript (javascript)
すると、brewコマンドが利用できるようになります。
watchとtreeのインストール
brew install watch
brew install tree
Linuxでは、多くのディストリビューションでwatchが標準搭載されています。treeは別途インストールが必要な場合があります。
たとえば、Ubuntu/Debian系の場合
sudo apt update
sudo apt install tree
3. 実際に使ってみた様子
コマンドを実行すると、画面全体にディレクトリ構造が表示されます。
画面上部には実行間隔と現在時刻が表示され、1秒ごとに更新されていることが確認できました。
たとえば、AIエージェントがファイルを作成すると、新しいファイル名が反転表示で現れます。
削除されたファイルは次の更新で消えます。
この視覚的なフィードバックにより、エージェントが今どのファイルに触れているのか、リアルタイムで把握できました。
ただし、このコマンドには、いくつか注意すべき点があります。
まず、更新間隔を短くしすぎると、システムに負荷がかかります。特に大規模なディレクトリでは、treeの実行自体に時間がかかるため、1秒間隔でも処理が追いつかない可能性があります。
また、treeコマンドがインストールされていない環境では動作しません。特にmacOSでは標準搭載されていないため、事前にHomebrewでインストールする必要があります。
画面のサイズにも制約があります。ディレクトリ構造が大きすぎると、すべてを表示しきれません。その場合は、-Lオプションの数字を小さくして階層を浅くするか、特定のサブディレクトリに絞って監視することをおすすめします。
4. 試してみてわかったこと
このコマンドを使うことで、AIコードエージェントの「思考の流れ」が見えるようになりました。どのファイルから作業を始め、どの順序で処理を進めているのか。その動きを観察することで、エージェントの動作原理についての理解が深まりました。
ただし、これはあくまでファイルの追加・削除を監視する方法です。ファイルの内容の変更までは表示されません。内容の変化を追いたい場合は、別のツールが必要です。
それでも、ディレクトリ全体の動きを俯瞰するには十分に役立ちます。特に、初めて使うツールやスクリプトの動作を理解したいとき、このような可視化は大きな助けとなります。
- watchコマンドはprocps-ngパッケージの一部として提供されており、多くのLinuxディストリビューションに標準搭載されています – watch command in Linux with Examples – GeeksforGeeks
- watchコマンドのデフォルト更新間隔は2秒で、-nオプションで0.1秒まで短縮可能です。0.1秒未満の値は0.1秒に変換されます – watch(1) – Linux man page
- -dまたは–differencesオプションは連続する更新間の差分をハイライト表示します。–cumulative引数と組み合わせると、初回実行以降のすべての変更を表示し続けます – Linux watch Command | Baeldung on Linux
- treeコマンドは再帰的にディレクトリをリスト表示するプログラムで、ファイルを階層構造で視覚化します。LS_COLORS環境変数が設定されている場合は色分け表示も可能です – tree(1) – Linux man page
- -dオプションを使用すると、treeコマンドはディレクトリのみをリストし、ファイルは表示しません。大規模なプロジェクトの構造把握に便利です – Linux ‘tree Command’ Usage Examples for Beginners
- デフォルトでは、treeコマンドは隠しファイル(ドットで始まるファイル)を表示しません。-aオプションでこれらも含めて表示できます。ただし、カレントディレクトリ「.」と親ディレクトリ「..」は表示されません – Linux tree Command Tutorial for Beginners (6 Examples)
- Homebrewは無料でオープンソースのパッケージマネージャーで、macOSとLinuxでソフトウェアのインストールを簡素化します。Rubyで書かれており、インテルベースのMacでは/usr/local、Apple Siliconでは/opt/homebrewにインストールされます – Homebrew — The Missing Package Manager for macOS (or Linux)