Лучший способ дедуплировать мою адресную книгу Thunderbird?

У меня есть тонна дублированных контактов в моей адресной книге Thunderbird. Я не хочу делиться ими с Google, но я хочу найти способ обмануть их. Был подключен дубликат диспетчера контактов, но он, похоже, был оставлен.

Могу ли я сделать это в командной строке?

У меня была такая же проблема несколько лет назад, и я написал очень маленький скрипт python для унификации экспорта LDIF в адресной книге Thunderbird:

  1. экспорт адресной книги как LDIF, например, abook.ldif
  2. запустить cat abook.ldif | unify_ldif.py > abook_new.ldif cat abook.ldif | unify_ldif.py > abook_new.ldif
  3. снова импортируйте abook_new.ldif (возможно, переименовать прежнюю адресную книгу раньше)

В настоящее время скрипт сопоставляет повторяющиеся записи по адресу электронной почты и идентичному имени, но это, конечно, можно адаптировать (в функции find_existing_entry ). Это работает для вас?

Программа находится здесь (EDIT: вам нужен пакет python-ldap ):

 #!/usr/bin/env python import sys from ldif import LDIFParser, LDIFWriter def find_existing_entry(ldif_entries, ldif_entry): for dn, entry in ldif_entries.items(): if 'mail' in ldif_entry and 'mail' in entry: for mail in ldif_entry['mail']: if 'mail' in entry and mail in entry['mail']: return dn if 'cn' in ldif_entry and 'cn' in entry and ldif_entry['cn'][0] in entry['cn']: return dn if 'sn' in ldif_entry and 'sn' in entry and 'givenName' in ldif_entry and 'givenName' in entry and ldif_entry['sn'][0] in entry['sn'] and ldif_entry['givenName'][0] in entry['givenName']: return dn return '' class MyLDIF(LDIFParser): def __init__(self, input, output): LDIFParser.__init__(self, input) self.writer = LDIFWriter(output) self.entries = {} def merge(self, dn, entry): if 'mail' in entry.keys(): if 'mail' in self.entries[dn].keys(): for mail in entry['mail']: if mail not in self.entries[dn]['mail']: self.entries[dn]['mail'].append(mail) else: self.entries[dn]['mail'] = entry['mail'] for key in entry.keys(): if key not in self.entries[dn].keys(): self.entries[dn][key] = entry[key] def handle(self, dn, entry): if dn in self.entries.keys(): self.merge(dn, entry) else: found_dn = find_existing_entry(self.entries, entry) if found_dn != '': self.merge(found_dn, entry) else: self.entries[dn] = entry def output(self): for dn, entry in self.entries.items(): self.writer.unparse(dn, entry) parser = MyLDIF(sys.stdin, sys.stdout) parser.parse() parser.output()