Rubyのfssmでフォルダを監視してファイルの新規作成、更新、削除をトリガとして特定の処理を実行するコード

はじめに

特定のフォルダ内のファイルの新規作成、更新、削除をトリガとする処理が必要な場面があり、調べていたらRubyのfssmというライブラリを使うと簡単にできることがわかったので実際に使用してみました。備忘録として使い方をメモしておきます。

fssmとは

fssmはRubyで使用できるライブラリであり、MacOSやLinuxのファイルシステムを監視してファイルの新規作成、更新、削除をトリガとした処理ができます。File System State Monitorであることからfssmとなっているようです。詳しくは以下のGitHub上のドキュメントに記述されています。

ttilley/fssm · GitHub

なお、fssmは以下のようにgemを使ってインストール可能です。


試した環境

以下の環境で試しました。

  • OS : Mac OS X 10.9.3
  • Ruby : ruby 2.0.0p451


コードの説明と基本的な使い方

以下に載せるコードの概要は次の通りです。

  • /Users/work/monitor/というディレクトリを監視対象とする
  • ファイルの新規作成、更新、削除それぞれをトリガとして実行するcreate_actionupdate_actiondelete_actionという関数を用意
  • create_actionupdate_actiondelete_actionはいずれも新規作成、更新、削除されたファイル名と日時をlog.txtに追記するだけの関数


コードの説明

3~19行目

ここでは、ファイルの新規作成、更新、削除それぞれの場合に実行する関数を定義しています。ここでは単純に新規作成、更新、削除などのアクションがあったファイル名とその日時をlog.txtに追記するだけの関数となっています。なお、`date`、はシェルコマンドのdateをバッククォートで囲んで実行させています。

21~33行目

ここでは、監視しているフォルダの指定と各アクションをトリガとする処理を記述しています。見て分かる通り、各アクションに対して、create_actionupdate_actiondelete_actionという関数をそれぞれ実行するように記述しています。baseは監視しているフォルダのパス、fileはアクションがあったファイル名です。なお、監視するフォルダは以下の部分で指定しています。

この指定によって、/Users/work/monitor/内のすべてのファイル、フォルダを監視します。また、フォルダについては再帰的に監視します。ワイルドカードを使い**/によって指定したフォルダを再帰的に監視するよう指定しており、**/に続く*が同じくワイルドカードで全ファイルを意味します。これについては以下のサイトが参考になりました。

singleton method Dir.[]
全てのサブディレクトリ以下のHTMLファイルを取得する


基本的な使い方

上記のコードをfssm_test.rbという名前で保存して、あとは以下のコマンドを実行してfssmを動作させます。

fssmが動作している状態で上記のコードで監視対象として指定したフォルダ/Users/work/monitor/にファイルを新規作成したり、更新、削除したりするとfssm_test.rbと同じフォルダ内のlog.txtにファイル名と日時が追記されていきます。log.txtが存在しない場合は自動で作成されます。
例えば、/Users/work/monitor/にファイルを新規作成してそのファイルをエディタで編集、保存、さらに削除した場合、log.txtに以下のように追記されます。


フォルダ内の特定のファイル、複数のフォルダを監視したい場合

上記のコードでは/Users/work/monitor/のみ監視しましたが、

  • /Users/work/monitor/内のファイルの内、拡張子が.txtであるファイルのみを監視
  • /Users/work/log/内のファイルの内、拡張子が.logであるファイルのみを監視

というように、fssmではパターンマッチを使えば特定の拡張子を持つファイルのみの監視や複数のフォルダの監視もできます。そのためには上記のコードの21〜33行目を以下のコードに置き換えます。以下のようにpath以降に監視したいフォルダとファイルの指定を記述して、あとはこれを複数記述することで可能です。特に新しいことはないので、以下のコードの説明は省略します。


まとめ

ここで載せたコードは各アクション、監視している各フォルダに対して同じ関数を実行しており、実行する関数自体もファイル名と日時を追記するだけの単純なものですが、当然ながらそれぞれ違う関数を実行したり、もっと複雑な関数を実行したりできるので、いろいろなことができ便利そうです。

このエントリーをはてなブックマークに追加

SPONSORED LINK

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL