Feb 28, 2011
重複メイル削除ツール
友人の 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
Edit this entry...
wikieditish message: Ready to edit this entry.
A quick preview will be rendered here when you click "Preview" button.