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_action
、update_action
、delete_action
という関数を用意 create_action
、update_action
、delete_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_action
、update_action
、delete_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
であるファイルのみを監視
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
まとめ
ここで載せたコードは各アクション、監視している各フォルダに対して同じ関数を実行しており、実行する関数自体もファイル名と日時を追記するだけの単純なものですが、当然ながらそれぞれ違う関数を実行したり、もっと複雑な関数を実行したりできるので、いろいろなことができ便利そうです。
関連記事
関連記事はまだありません。