Mac のダウンロードフォルダを定期的に自動整理する

先日 Mountain Lion がリリースされましたが、ようやくこないだ Lion にしたばっかりだしぃ、仕事マシンで人柱志願は出来ないしぃ、等と言い訳しつつインスコは1〜2ヶ月後と決めている Mariyudu@石橋を叩いて渡るプログラマ、です。ども、毎日暑いっすね。

OS X といえば、皆さん「ダウンロード」フォルダの整理ってどうしてますか? 今まで深く考えずに、溜まったファイルを手作業で時々ゴミ箱に捨てるという感じだったのですが、これを自動化できないかと考えました。あまり手間暇は掛けたくないので、「30日以上経過したダウンロードフォルダ内のファイルをゴミ箱に移動する」てな処理をコマンドで毎時実行するように crontab に登録していっちょ上がり、の筈だったのですが… 最初はこんな感じでした↓。

find ~/Downloads -ctime +30 -depth 1 ! -name .\* -exec mv {} ~/.Trash/ \;

条件がちょっとめんどくさいのは、対象がフォルダの場合に中を辿らないようにとか、.DS_Store 等の隠しファイルを対象から除外する等のお呪いです。さてこの場合、ゴミ箱移動が mv だとファイル名が既にゴミ箱にあるものと同じときにマズいのですよね。そこまで対応しようとするとワンライナーじゃ無理っぽいし、やっぱり Finder のゴミ箱に捨てる機能をターミナルから使いたいな、と Google 先生に相談してたらこんなものが → 「コマンドラインからゴミ箱に捨てるシェルスクリプト」おお、何て素晴らしい! 早速これをまんま使わせて頂くことにします。この内容どおりに trash というテキストファイルを作り、

chmod +x trash ; sudo mv trash /usr/local/bin/

とパスの通った所にインストール。んで、さっきの毎時処理を以下のように書き換えます。

find ~/Downloads -ctime +30 -depth 1 ! -name .\* -exec /usr/local/bin/trash {} \;

これで一応、当初の要求は満たすのですが、突然「ガサッ」とゴミ箱入りの音だけがするのもアレなので、通知もさせたくなりました。通知センターにコマンドからメッセージを送れないかとぐぐったらこんなの → https://github.com/alloy/terminal-notifier がありましたが、どうも Mountain Lion 版だけみたいですね。せっかくの OSS なんだからコード嫁、的なお叱りを受けそうだけど「明日から本気だす」ということにしてw、say コマンドによる音声メッセージでお茶を濁すことにします。

という訳で、ゴミ箱ポイした時に「ダウンロードフォルダの古いファイルをゴミ箱に捨てました」とアナウンスが流れるようにしたのがこれ↓。

TRAHSED=`find ~/Downloads -ctime +30 -depth 1 ! -name .\* -exec /usr/local/bin/trash {} \; -print`; if [ -n "$TRAHSED" ]; then say -v Princess "Download folder no full yee file wo gomibako nee stair mashitaa"; fi

say コマンドは日本語は受け付けてくれないので、それっぽい台詞に聞こえるようにローマ字と英語をちゃんぽんにして調整したですww あと、声は比較的萌え系の Princess タソで。ちょっと長くなっちゃったけど、ぎりぎりワンライナーと言っても良いかと。これを適当な頻度で crontab に登録して実行させます。crontab に関する手順は、CUI に慣れていないユーザへのリスクを考えて割愛します。CronniX のような GUI の crontab 管理アプリもあるので、その辺を使うのも良いかと。

以上、ローテク小ネタでした。じゅうぶんな検証を経てないので、ご利用は自己責任でおながいします。