2012-05-09 3 views
2

У меня есть почтовый ящик mbox, содержащий повторяющиеся копии сообщений, которые отличаются только заголовком «X-Evolution:».Как удалить дубликаты (дедуплицировать) почтовый ящик формата mailbox?

Я хочу удалить дубликаты, как можно быстрее и проще. Похоже, что это уже было написано, но я его не нашел, хотя я посмотрел на модуль почтового ящика Python, различные синтаксические анализаторы perl mbox, formail и т. Д.

Есть ли у кого-нибудь предложения?

ответ

4

Это то, что я использовал:

rm -f idcache; \ 
zcat archive_2012.gz | \ 
formail -D $((1024*1024*10)) idcache -s | \ 
gzip -9c > archive_2012-dedup.gz 
  1. удаляет старые записи кэша
  2. распаковывает старый файл на stdout
  3. запускает formail как фильтр (с кешем 10 мегабайт, называемым idcache, stdout-to-stdout)
  4. на лету повторно сжимает дедуплицированный поток и выгружает его в новый файл

После некоторой проверки я перезаписываю старый файл новым файлом.

FORMAIL является частью Procmail утилит

0

'FORMAIL -D' и 'reformail -D' может обрабатывать только одно письмо за исполнение. Перед отправкой каждая почта должна быть отделена от mbox. Вместо этого я использую reformail из maildrop, так как он все еще находится в активной разработке.

  1. удалить старую idcache, tmpmail, nmbox
  2. запустить dedup.sh.
  3. nmbox - это вывод с удаленным дублирующимся сообщением.

dedup.sh

#! /bin/sh 
# $1 = mbox, thunderbird mailbox 
# wmbox.sh is called for each mail. 

cat $1 | reformail -s ./wmbox.sh 

wmbox.sh

#! /bin/sh 
# stdin: a email 
# called by dedup.sh 

TM=tmpmail 
if [ -f $TM ] ; then 
    echo error! 
    exit 1 
fi 
cat > $TM 
# mbox format, each mail end with a blank line 
echo "" >> $TM 

cat $TM | reformail -D 99999999 idcache 

# if this mail isn't a dup (reformail return 1 if message-id is not found) 
if [ $? != 0 ]; then 
    # each mail shall have a message-id 
    if grep -q -i '^message-id:' $TM; then 
     cat tmpmail >> nmbox 
    fi 
fi 

rm $TM