OmniFocusのバックアップファイルを定期的に削除する - cron/tmpwatch

Mac版のOmniFocusは起動時などにデータのバックアップを作成しています。
その為、毎日のように使い続けていると、気づかぬうちに意外なほどディスク容量を食っている状態になってしまっている可能性があります(^_^;)

これがiMacなどのHDD容量に余裕がある環境であれば、気にしないという方法(限度はあるにしても)も取れると思うのですが、Macbook airなどではSSDの容量を気にしなければならない事も多いわけで…
後になって、急に迫られてその辺りの整理をする事になる前に、今のうちからその辺りの整理方法を考えてみようかなと。

そもそも、全体的にTimemachineで定期的にバックアップを作成しているのであれば、OmniFocusのバックアップ機能で生成されたファイルをいつまでも保持している必要性は無いと言って良いはず。
なので、適当なタイミングで定期的にファイルを削除してしまうことで、普段からディスク容量に余裕を持たせる事が出来ます。

まずは、かなりマニアックな方法なのですが、cron/tmpwatchを使用して定期的にファイルを削除する方法を考えました。
基本Terminalでの操作になります(^_^;)

※OmniFocusのバックアップ設定は環境設定で変更できます。ここではファイルパスなどについてはデフォルトの ~/Documents/OmniFocus Backups フォルダに配置されている前提でコマンドなどを記載しています。
環境設定を変更している方は適時その辺りの読み替えをお願いします。

まず、定期的なファイルの削除で tmpwatch というコマンドを使います。
Linuxなどではだいたい標準装備されているのですが、Mac OSでは、Macports環境にしていてもこのコマンドがありませんorz

なので、コマンドのインストールから行う必要が出てきます。
今回はソースファイルからダウンロードしてきてコンパイルしました。
※ソースからのコンパイルには開発環境などがインストールされている必要があります

$ curl https://fedorahosted.org/releases/t/m/tmpwatch/tmpwatch-2.10.3.tar.bz2 > tmpwatch-2.10.3.tar.bz
$ tar jxvf tmpwatch-2.10.3.tar.bz2
$ cd tmpwatch-2.10.3
$ ./configure
$ make
$ sudo make install

※Terminalで入力するコマンドを列挙しました。先頭の $ は、Terminalが出力してくれる(その前に色々情報が出てると思いますが、割愛してます)ので入力不要です

これで、tmpwatchコマンドがインストールされて使えるようになりました。
ひとまず試しにTerminalで動作確認してみます。
※以下のコマンドでは実際にファイルの削除まではされません。

$ /usr/local/sbin/tmpwatch -amft 240 ~/Documents/OmniFocus\ Backups/ | grep directory

この状態で10日以前に作成されたバックアップファイルの情報が出てきたら成功です( ´ ▽ ` )ノ

tmpwatchのコマンドラインについて簡単に説明すると、最後に変更されてから240時間(10日)以上経過したファイル/ディレクトリなどを削除する指定にしています。
細かいオプションの説明を man tmpwatch から抜粋します。-amft の部分がこのオプションにあたります。

       -a, --all
              Remove all file types, not just regular  files,  symbolic  links
              and directories.
       -m, --mtime
              Make  the  decision  about  deleting  a file based on the file's
              mtime (modification time) instead of the atime.
       -f, --force
              Remove  root-owned  files even if root doesn't have write access
              (akin to rm -f).
       -t, --test
              Don't remove files, but go through the motions of removing them.
              This implies -v.

続けて定期的にこのコマンドを使ってファイル削除してもらえるように、cronに登録します。

0 0 * * * /usr/local/sbin/tmpwatch -amf 240 ~/Documents/OmniFocus\ Backups/ 2&>1 > /dev/null

こんな感じのテキストファイルを crontab.txt という名前で用意しておきます。
※viなどの操作に慣れていて、直接編集するよ!っていう方は crontab -e で直接編集しちゃってください(^_^;)
記載内容の細かい説明は割愛しますが…
先頭から「分/時/日/月/曜日/実行するコマンド」の順番にスペース区切りで記載しています。
この場合、毎日0時0分にtmpwatchでバックアップを削除する設定となっています。
先ほどと異なり、tmpwatchのオプションに t は入れません(実際に削除させる設定)

$ crontab crontab.txt
$ crontab -l
0 0 * * * /usr/local/sbin/tmpwatch -amf 240 ~/Documents/OmniFocus\ Backups/ 2&>1 > /dev/null

crontabコマンドでテキストファイルの中身を入力させ、次いで crontab -l コマンドで登録された内容を確認しています。
登録された内容に問題が無ければ、これで日付が変わる頃に勝手にファイルが削除されているはずです( ´ ▽ ` )ノ

ただこれだけだと、面白くない自分が気づかないうちにファイルが削除されてしまうという状態になっている為、 cronが実行されてファイルを削除した場合にGrowlで通知されるように設定を変更してみます。

ここから先、Growlインストール時に Extras から、growlnotify というコマンドがインストールされている事が前提となります。
growlnotify のインストールは、先ほどのtmpwatchとは異なり、Growl本体と同様にpkgファイルが提供されているので、通常のアプリインストールと同様に pkgファイルからインストールしてください。

0 0 * * * NF=`/usr/local/sbin/tmpwatch -amf 240 ~/Documents/OmniFocus\ Backups/ | grep -e '^removing directory' | awk 'END {print NR;}'` ; if [ $NF -gt 0 ] ; then /usr/local/bin/growlnotify -t "OmniFocus Backup" -m "$NF backups deleted." ; fi

うちのcrontabはこんな感じなのですが…
これでは余りにもわかりづらいので、実際のコマンド部分を整形したものをこちらに(^_^;)
# あんまり代わり映えはしませんがorz

NF=`/usr/local/sbin/tmpwatch -amf 240 ~/Documents/OmniFocus\ Backups/ | grep -e '^removing directory' | awk 'END {print NR;}'` ;
if [ $NF -gt 0 ] ;
then
    /usr/local/bin/growlnotify -t "OmniFocus Backup" -m "$NF backups deleted." ;
fi

先だって登録したものと同様、tmpwatchを実行し、その結果を grep/awk を利用して、実際に削除されたファイル(実際にはdirectoryなのですが)の数を計算しています。
次に、ファイル削除された数が 0以上であれば(要するに削除されているなら)、Growlでメッセージを表示するという内容になっています。
これで、気づかぬうちにファイルが消えているという恐怖を感じる必要はありません( ´ ▽ ` )ノ

単にファイルを削除したいだけなのに、ここまでしなきゃならないなら自分で消すよ!
と言いたくなる方も居ると思うので、次回はAutomatorで削除する方法を紹介しようと思っています(^_^;)