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

公開日:2014/07/10 更新日:2014/07/10
Rubyのfssmでフォルダを監視してファイルの新規作成、更新、削除をトリガとして特定の処理を実行するコードのサムネイル

はじめに

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

fssmとは

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

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

試した環境

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

  • 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に追記するだけの関数

コードの説明

require 'fssm'

def create_action(base,file)
    open('log.txt', 'a'){|f|
      f.puts base + "/"  + file + " was created at " + `date`
    }
end

def update_action(base,file)
    open('log.txt', 'a'){|f|
      f.puts base + "/"  + file + " was updated at " + `date`
    }
end
 
def delete_action(base,file)
    open('log.txt', 'a'){|f|
      f.puts base + "/" + file + " was deleted at " + `date`
    }
end
 
FSSM.monitor('/Users/work/monitor/','**/*') do
 
 create do |base,file|
     create_action(base, file)
 end
 update do |base,file|
     update_action(base, file)
 end
  delete do |base,file|
     delete_action(base, file)
 end

end

3~19行目

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

21~33行目

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

FSSM.monitor('/Users/work/monitor/','**/*') do

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

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

基本的な使い方

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

$ ruby fssm_test.rb

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

/Users/work/monitor/test1.txt was created at 2014年 7月10日 木曜日 14時21分44秒 JST
/Users/work/monitor/test1.txt was updated at 2014年 7月10日 木曜日 14時22分01秒 JST
/Users/work/monitor/test2.txt was created at 2014年 7月10日 木曜日 14時22分05秒 JST
/Users/work/monitor/test2.txt was deleted at 2014年 7月10日 木曜日 14時22分11秒 JST

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

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

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

 path '/Users/work/monitor/','**/*.txt' do
 
   create do |base,file|
       create_action(base, file)
   end
   update do |base,file|
       update_action(base, file)
   end
    delete do |base,file|
       delete_action(base, file)
   end

 end

 path '/Users/work/log/','**/*.log' do
 
   create do |base,file|
       create_action(base, file)
   end
   update do |base,file|
       update_action(base, file)
   end
    delete do |base,file|
       delete_action(base, file)
   end
   
 end

end

まとめ

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

関連記事

関連記事はまだありません。

開発アプリ

nanolog.app

毎日の小さな出来事をなんでも記録して、ログとして残すためのライフログアプリです。