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?


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()

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,mail=foo@example.org'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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.