Der beste Weg, um mein Thunderbird-Adressbuch zu deduplizieren?

7

Ich habe eine Menge doppelter Kontakte in meinem Thunderbird-Adressbuch. Ich möchte sie nicht mit Google teilen, aber ich möchte einen Weg finden, sie zu betrügen. Es gab ein doppeltes Plug-in für den Kontaktmanager, das jedoch offenbar aufgegeben wurde.

Kann ich das über die Kommandozeile tun?

Amanda
quelle
Wie sich herausstellt, scheint der doppelte Kontaktmanager zurück zu sein und großartig zu funktionieren. addons.mozilla.org/en-US/thunderbird/addon/…
Amanda

Antworten:

2

Ich hatte vor einigen Jahren das gleiche Problem und schrieb ein sehr kleines Python-Skript, um den LDIF-Export eines Thunderbird-Adressbuchs zu vereinheitlichen:

  1. Exportieren Sie das Adressbuch als LDIF in z. B. abook.ldif
  2. Lauf cat abook.ldif | unify_ldif.py > abook_new.ldif
  3. importiere abook_new.ldif erneut (benenne vielleicht das alte Adressbuch vorher um)

Das Skript stimmt derzeit mit doppelten Einträgen in der E-Mail-Adresse und im identischen Namen überein, dies kann jedoch natürlich angepasst werden (in Funktion find_existing_entry). Geht das für dich?

Das Programm ist hier (BEARBEITEN: Sie benötigen das python-ldapPaket):

#!/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()
jmuc
quelle
Seltsamerweise habe / kann ich das ldif-Modul nicht finden. Pip sagt "Konnte keine Downloads finden, die die Anforderung ldif erfüllen. Es wurden überhaupt keine Distributionen für ldif gefunden"
Amanda
Ich denke, Sie müssen das Python-LDAP-Paket installieren! (Ich habe meine Antwort bearbeitet)
jmuc
Ich habe versucht, es mit pip zu installieren, aber es ist ein Ubuntu-Paket.
Amanda
Okay, das fängt an zu funktionieren, aber es mag keine Einträge mit Kommas. Es verschluckt sich an Zeilen wie: 'cn=Last Name, First Name,[email protected]'Ich kann das LDIF bearbeiten, um das störende Komma zu entfernen, aber es findet ein anderes.
Amanda
1
Dies funktionierte sehr gut, um die meisten von ihnen auszuräumen::%s/cn=\([-'a-z]*\),\s\([a-z]*\),mail/cn=\2 \1,mail/g
Amanda