Как я могу удалить дубликаты (дедупликацию) почтового ящика в формате mbox?
У меня есть почтовый ящик mbox, содержащий дубликаты сообщений, которые отличаются только своим заголовком "X-Evolution:".
Я хочу удалить дубликаты как можно быстрее и проще. Кажется, что это уже было бы написано, но я не нашел его, хотя я посмотрел на модуль почтового ящика Python, различные парсеры perl mbox, formail и так далее.
У кого-нибудь есть предложения?
3 ответа
Это то, что я использовал:
rm -f idcache; \
zcat archive_2012.gz | \
formail -D $((1024*1024*10)) idcache -s | \
gzip -9c > archive_2012-dedup.gz
- удаляет старые записи в кэше
- распаковывает старый файл на стандартный вывод
- запускает formail как фильтр (с кешем 10 мегабайт, называется idcache, stdout-to-stdout)
- на лету повторно сжимает дедуплицированный поток и выгружает его в новый файл
После некоторой проверки я перезаписываю старый файл новым.
formail является частью утилит procmail
Я не смотрел на formail (часть procmail) достаточно подробно. У него есть такая опция, как упомянуто в таких местах, как: http://hints.macworld.com/comment.php?mode=view&cid=115683 и http://us.generation-nt.com/answer/deleting-duplicate-mail-messages-help-172481881.html
"formail -D" и "reformail -D" могут обрабатывать только одно письмо за одно выполнение. Каждое письмо должно быть отделено от mbox перед обработкой. Вместо этого я использую reformail от maildrop, так как он все еще находится в активной разработке.
- удалить старый idcache, tmpmail, nmbox
- запустить dedup.sh.
- 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