🕰
ファイルが届いたら何かするを自動化する
チャットツールで毎回「(所定の共有ディレクトリに)ファイル置いたんでよろしく」みたいなテンプレ連絡を貰って何かのコマンドを叩くという流れ作業は仲間とうまく連携をとって仕事をしているように見えて実際のところかなり無駄です。待つのに意識が行って集中できないし、待っている時間がもったいないし、少し席を外しているときに連絡が来て対応が遅れてしまったりする心配もあります。なので
でこっそり自動化します (そしてこの作業のことは完全に忘れて他のことをやります)
require "bundler/inline"
gemfile do
source "https://rubygems.org"
gem "rb-fsevent"
end
require "kconv"
dir = "~/Dropbox/みんなと共有"
options = {
:latency => 30, # N秒に1回は通知する (小さいと負荷が大きくなる)
:file_events => true, # ファイルも監視する
}
FSEvent.new.tap do |instance|
instance.watch(Pathname(dir).expand_path.to_s, options) do |paths, meta|
meta["events"].each do |e|
e = e.dup
e["path"] = e["path"].toutf8
p e
end
end
instance.run
end
あとは e["path"]
に入っているファイルに対して何かさせるだけです。
toutf8
している理由はファイルに日本語が含まれていると文字化けするからです。
単にディレクトリを監視したい場合は p e
のところで次のコードを入れると音声で状況を把握できます。
behavior = {
"ItemRemoved" => "削除",
"ItemCreated" => "追加",
"ItemInodeMetaMod" => "更新",
"ItemXattrMod" => "参照",
"ItemRenamed" => "名変",
}.collect { |key, value|
if e["flags"].include?(key)
value
end
}.compact.join(" ")
system "say '#{behavior}'"
time = Time.now.strftime("%F %T")
puts %(#{time} #{behavior} #{e["path"]})
監視するだけでも報告を貰う前にファイルが届いたことがわかって便利です。
Discussion