2011/02/28

重複メイル削除ツール

友人の awk (1) の勉強支援の第 3 段。 以前 Software のペイジで公開したスクリプトの中身。

1 メール 1 ファイルの形式(mh 形式)で格納されたメイル本文のうち Message-Id: ヘッダが重複するものを抽出して削除するツールで、 sort (1) や uniq (1) だけを利用しても実装可能だが、 可読性と拡張性、実装の手間等を考えて簡単に awk (1) で実装した。
Message-Id: ヘッダから取得したメッセージ ID をインデックスとして ファイル名を連想配列に格納しており、 既にメッセージ ID が連想配列のインデックスとして存在している場合は メッセージ ID が重複したものとしてファイル名を標準出力に出力するだけの 非常に簡単な内容のスクリプトだ。

  1#!/bin/sh
  2#
  3#   All rights reserved, copyright (c) 2009, Mitzyuki IMAIZUMI
  4#   $Id: DupmailMac,v 1.1 2009/09/30 09:25:09 mitz Exp $
  5#
  6
  7exec 2> /dev/null
  8
  9# Mac のメールボックスのデフォルトロケーション
 10basedir="${HOME}/Library/Mail"
 11
 12find ${basedir} -name "*.mbox" -a -type d |
 13while read folder
 14do
 15    if [ -d "${folder}/Messages" ]
 16    then
 17        awk '{
 18            # 大文字小文字を区別しないために全部小文字に変換
 19            if(tolower($1) ~ /^message-id:/){
 20                # 入力行を `:' で分割する (line[2]: message-id)
 21                split($0, line, ":");
 22                # message-id から余計なスペース、 <、> を削除
 23                gsub("[<> ]", "", line[2]);
 24
 25                if(message[line[2]] != "")
 26                    # message-id に対応するファイルがある場合はファイル名を表示
 27                    print FILENAME;
 28                else
 29                    # message-id に対応するファイルがない場合はファイル名を格納
 30                    message[line[2]] = FILENAME;
 31            }
 32        }' ${folder}/Messages/* |
 33        # ファイルの削除
 34        sort | uniq | xargs rm
 35    fi
 36done
    


Copyright © Mitzyuki IMAIZUMI 2008,2009. All rights reserved.