🕰

ファイルが届いたら何かするを自動化する

2022/06/24に公開

チャットツールで毎回「(所定の共有ディレクトリに)ファイル置いたんでよろしく」みたいなテンプレ連絡を貰って何かのコマンドを叩くという流れ作業は仲間とうまく連携をとって仕事をしているように見えて実際のところかなり無駄です。待つのに意識が行って集中できないし、待っている時間がもったいないし、少し席を外しているときに連絡が来て対応が遅れてしまったりする心配もあります。なので

https://github.com/guard/rb-fsevent

でこっそり自動化します (そしてこの作業のことは完全に忘れて他のことをやります)

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