Python · Google Drive ↔ OneDrive · Open-Source-Leitfaden für die technische Umsetzung

Sichere Übertragung zwischen Google Drive und OneDrive mit Python erstellen

Dieser Leitfaden macht aus einem unerwartet schwierigen Cloud-Kopiervorgang eine klar definierte Pipeline: erfassen, Vorabprüfungen durchführen, zwischenspeichern, Hash bilden, hochladen, erneut herunterladen, vergleichen, Checkpoint speichern und erst dann lokalen Speicherplatz freigeben.

Aktualisiert ; 22 Min. Lesezeit.

Kurzantwort

Für eine verwaltete Migration automatisiert FileArk diesen Ablauf, ohne Ihren Computer als Datentransportweg zu nutzen. FileArk wurde mit Migrationslasten von mehreren Terabyte getestet und prüft den Empfang von der Quelle, die Annahme des Uploads durch den Anbieter und das Zielobjekt, bevor ein Erfolg gemeldet wird. Wenn Sie die Pipeline selbst betreiben möchten, führt das nachfolgende Python-Programm mit MIT-Lizenz eine konservative Kopie über Ihren Computer durch und löscht niemals Quelldateien.

Betriebsmodell vor dem Code auswählen

Ein direkter Cloud-Migrationsdienst ist die praktische Wahl, wenn die Datenbestände groß sind, die Verbindung unbeaufsichtigt laufen muss oder die Daten nicht über einen Laptop übertragen werden sollen. FileArk hält die Übertragung online, überwacht die Antworten der Anbieter, wiederholt Vorgänge bei behebbaren Fehlern und bietet Ihnen eine zentrale Fortschrittsansicht. Der Validierungsprozess führt drei unabhängige Prüfungen durch, bevor eine Datei als vollständig gilt.

Ein lokales Skript ist nützlich, wenn Sie die vollständige Kontrolle über OAuth-Anwendungen, Laufwerke für die Zwischenablage, Protokolle oder Richtlinien für Zielordner benötigen. Der Nachteil ist die betriebliche Verantwortung: Ihr Rechner muss online bleiben, seine Netzwerkverbindung wird zum Engpass, OAuth-Anmeldedaten müssen geschützt werden und für den aktiven Batch sowie die Prüfkopie muss genügend temporärer Speicherplatz verfügbar bleiben.

Das hier veröffentlichte Programm ist bewusst konservativ ausgelegt. Es kopiert Dateien vom Stammverzeichnis eines persönlichen Speichers in einen neuen Zielordner. Es stellt keine Löschmethode bereit, überschreibt keine Konflikte, speichert nach der Überprüfung einen dauerhaften Checkpoint und hält an, sobald die lokale Kapazität oder die Zielkapazität unter die von Ihnen konfigurierte Reserve fällt.

Die Übertragungspipeline und ihre Fehlergrenzen

  1. Quellverzeichnis erfassen

    Der Quelladapter durchläuft Ordner rekursiv, folgt der Paginierung des Anbieters, erfasst IDs, Pfade, Typen und gemeldete Größen und ordnet unterstützten nativen Google-Dateien portable Exportformate zu.

  2. Zielkapazität und lokalen Speicherplatz vorab prüfen

    Die Engine vergleicht die ausstehenden Bytes zuzüglich einer konfigurierbaren Reserve mit dem Speicherkontingent am Ziel. Außerdem prüft sie das Dateisystem der Zwischenablage vor jedem Batch und jedem einzelnen Download.

  3. Einen begrenzten Batch zwischenspeichern

    Dateien werden in Batches verarbeitet, die sowohl durch die Gesamtzahl der Bytes als auch durch die Dateianzahl begrenzt sind. Nur der aktuelle Batch belegt lokalen Speicherplatz, sodass für eine große Bibliothek kein Laufwerk derselben Größe erforderlich ist.

  4. Hash bilden und hochladen

    Nach dem Herunterladen berechnet das Skript lokal den SHA-256-Hash, prüft eine gegebenenfalls bekannte Quelldateigröße, erstellt die Zielordner und lädt die Datei in fortsetzbaren, mit dem Anbieter kompatiblen Blöcken hoch.

  5. Überprüfen und Checkpoint speichern

    Im Standardmodus wird das neue Zielobjekt erneut heruntergeladen und per SHA-256 verglichen. Nur eine übereinstimmende Datei wird in den JSON-Prüfpunkt eingetragen und aus dem lokalen Bereitstellungsbereich entfernt.

Vollständige Python-Version mit MIT-Lizenz herunterladen

Der Download besteht aus einem einzigen, gut lesbaren Python-Einstiegspunkt. Anbieter-SDKs werden nur für eine echte Übertragung importiert, sodass die Demo- und Hilfebefehle bereits ausgeführt werden können, bevor Abhängigkeiten oder Anmeldedaten installiert sind. Eine separate Anforderungsdatei legt die unterstützten Mindestversionen der Pakete fest, und die Lizenz wird zusammen mit dem Quellcode bereitgestellt.

Lesen Sie den Code vor der Verwendung, testen Sie ihn mit einem kleinen Zielordner und behalten Sie für wertvolle Daten die standardmäßige Überprüfung durch erneutes Herunterladen bei. Kein allgemeines Skript kann sämtliche Freigabeberechtigungen, Verknüpfungen, Aufbewahrungsbezeichnungen, Regeln für geteilte Ablagen oder Mandantenrichtlinien abbilden.

Python-Übertragungsprogramm herunterladen
Direkte Implementierung mit Google Drive API und Microsoft Graph einschließlich Batchverarbeitung, Checkpoints, Wiederholungsversuchen, Speicherkontingentreserven und SHA-256-Überprüfung am Ziel.
fileark-cloud-transfer.py · Python 3.10+ · MIT-Lizenz

Python-Abhängigkeiten herunterladen
Kleine Abhängigkeitsliste für Google OAuth und Drive, Microsoft-Authentifizierung, Graph-Anfragen und Wiederholungsversuche.
requirements-fileark-cloud-transfer.txt · pip-Anforderungen · Nur-Text

MIT-Lizenz herunterladen
Lizenzhinweis für beide Skripte von FileArk zur manuellen Übertragung.
LICENSE-fileark-cloud-transfer.txt · MIT · Klartext

Sicherheitsablauf vor der Freigabe des Cloud-Zugriffs ansehen

Terminal mit dem FileArk-Python-Skript zur Cloud-Übertragung im netzwerkfreien Demomodus
Die integrierte Demo führt den für Betreiber sichtbaren Ablauf ohne Anmeldedaten oder Netzwerkanfragen aus. Bei einem echten Durchlauf werden dieselben Angaben zu Kapazität, Batches, Verifizierung, Prüfpunkt und Status der Quelllöschung ausgegeben.

Führen Sie zuerst die Demo aus. Sie stellt keine Netzwerkverbindungen her und schreibt keine Daten in die Cloud. Die letzte Zeile ist bewusst eindeutig: Es wurden null Quelldateien gelöscht. Die eigentliche Engine gibt dieselbe Abfolge über strukturierte Protokolle aus und beendet sich bei der ersten nicht verifizierten Datei mit einem Exit-Code ungleich null.

Smoke-Test ohne Netzwerkzugriff
chmod +x fileark-cloud-transfer.py
python3 fileark-cloud-transfer.py --demo
python3 fileark-cloud-transfer.py --help

OAuth-Clients erstellen, ohne Geheimnisse einzubetten

Erstellen Sie für Google Drive einen Desktop-OAuth-Client in einem Google-Cloud-Projekt, aktivieren Sie die Drive API, konfigurieren Sie den Zustimmungsbildschirm und laden Sie die Client-JSON-Datei herunter. Übergeben Sie den Pfad mit --google-client-secret oder legen Sie GOOGLE_OAUTH_CLIENT_SECRET_FILE fest. Das Skript fordert Zugriff auf Drive an, da es Dateien auflisten, herunterladen, hochladen und überprüfen sowie Ordner erstellen muss.

Registrieren Sie für OneDrive eine öffentliche Clientanwendung in Microsoft Entra ID, aktivieren Sie den Gerätecodeflow, fügen Sie die delegierte Berechtigung Files.ReadWrite hinzu und übergeben Sie die Client-ID der Anwendung. Wählen Sie „common“ für private und Organisationskonten, „organizations“ für Geschäftskonten oder eine bestimmte Mandanten-ID, wenn dies gemäß Richtlinie erforderlich ist.

Tokens werden in lokalen Dateien zwischengespeichert, damit eine unterbrochene Migration ohne erneute Anmeldung fortgesetzt werden kann. Behandeln Sie die Client-JSON-Datei und die Token-Caches wie Geheimnisse: Schließen Sie sie von der Versionsverwaltung aus, schränken Sie die Dateisystemberechtigungen ein, laden Sie sie niemals in Support-Tickets hoch und entfernen Sie sie, sobald die Migration abgenommen wurde.

Abhängigkeiten in einer isolierten Umgebung installieren
python3 -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements-fileark-cloud-transfer.txt

Von Google Drive zu OneDrive übertragen – oder umgekehrt

Alle identitätsspezifischen Werte werden vom Betreiber bereitgestellt. Das Programm enthält weder Client-ID noch Geheimnis, Mandant, Token, Remotekonto oder Anmeldedaten für den Zielort. Der erste Befehl meldet Sie in einem Browser bei Google und per Gerätecode bei Microsoft an und kopiert die Daten anschließend in einen neuen OneDrive-Ordner.

Vertauschen Sie Quelle und Ziel, um die Übertragung von OneDrive zu Google Drive auszuführen. Verwenden Sie für jede eigenständige Migration eine andere Statusdatei und einen anderen Zielstammordner. Der Checkpoint verknüpft Quellanbieter, Zielanbieter und Stammordner miteinander und verweigert die Fortsetzung bei einer abweichenden Konfiguration.

Von Google Drive zu OneDrive mit 8-GiB-Batches
export MICROSOFT_CLIENT_ID="your-public-client-id"
python fileark-cloud-transfer.py \
  --source google \
  --destination onedrive \
  --google-client-secret ./client_secret.json \
  --microsoft-tenant common \
  --destination-root "FileArk Manual Transfer 2026-07-25" \
  --batch-gib 8 \
  --batch-files 200 \
  --local-reserve-gib 15 \
  --destination-reserve-gib 10 \
  --verification redownload
Umgekehrte Richtung: OneDrive zu Google Drive
python fileark-cloud-transfer.py \
  --source onedrive \
  --destination google \
  --microsoft-client-id "$MICROSOFT_CLIENT_ID" \
  --google-client-secret ./client_secret.json \
  --destination-root "OneDrive archive 2026-07-25" \
  --state-file ./onedrive-to-google-state.json \
  --verification redownload

Warum die Kapazität mehrfach geprüft wird

Eine einmalige Vorabprüfung kann während einer langen Übertragung veralten. Jemand könnte weitere Dateien an den Zielort hochladen, ein exportiertes Google-Dokument könnte größer sein, als seine Quellmetadaten vermuten lassen, und andere Anwendungen könnten lokalen Speicherplatz belegen. Die Engine prüft daher vor dem Start die gesamte Kapazität am Zielort, bei jedem Batch erneut die Zielkapazität, nach jedem lokalen Download nochmals die Zielkapazität und vor jeder Bereitstellungs- oder Verifizierungskopie den lokalen Speicherplatz.

Die Reservewerte dienen als betrieblicher Puffer und sind keine Schätzungen der Übertragungsgröße. Wählen Sie sie hoch genug, um Betriebssystemupdates, Verzögerungen bei der Kontingenterfassung durch den Anbieter und andere Nutzer desselben Cloud-Kontingents zu berücksichtigen. Wenn ein Anbieter kein endliches verbleibendes Kontingent ausweist, gibt das Skript eine Warnung aus und verlässt sich auf die Durchsetzung durch den Anbieter. Das ist weniger zuverlässig als eine Vorabprüfung mit bekanntem Kontingent und erfordert eine aktive Überwachung.

Die Fail-Closed-Invariante für Speicherkontingente
def ensure_destination_capacity(quota, required, reserve):
    if quota.remaining is None:
        LOG.warning("Destination did not report a finite quota")
        return
    needed = required + reserve
    if quota.remaining < needed:
        raise RuntimeError(
            f"Destination is too small: {human_bytes(quota.remaining)} free, "
            f"{human_bytes(needed)} required including reserve."
        )

Bereitstellungsvolumen nach Bytezahl und Dateianzahl begrenzen

Eine Byte-Obergrenze begrenzt die Speicherplatzbelegung; eine Obergrenze für die Dateianzahl begrenzt den API- und Dateisystemaufwand, wenn die Quelle Hunderttausende winziger Objekte enthält. Eine Datei, die größer als die Batch-Obergrenze ist, wird als Ein-Datei-Batch zugelassen. Daher muss die Reserve für das größte Einzelobjekt ausgelegt sein.

Die standardmäßige Blockgröße beträgt 10 MiB. Das ist ein gemeinsames Vielfaches der 256-KiB-Granularität für fortsetzbare Uploads bei Google Drive und der Microsoft-Graph-Anforderung von 320 KiB für sequenzielle Fragmente. Die Befehlszeilenvalidierung lehnt inkompatible Blockgrößen vor der Authentifizierung ab.

Batch-Planer mit zwei Grenzwerten
def batches(files, max_bytes, max_files):
    batch, batch_size = [], 0
    for item in files:
        planned_size = max(item.size, 1)
        if batch and (
            len(batch) >= max_files
            or batch_size + planned_size > max_bytes
        ):
            yield batch
            batch, batch_size = [], 0
        batch.append(item)
        batch_size += planned_size
    if batch:
        yield batch

Native Google-Dokumente durch Konvertierung verarbeiten

Google Docs, Tabellen, Präsentationen, Zeichnungen und Apps-Script-Projekte sind keine gewöhnlichen, herunterladbaren Byte-Streams. Der Google-Adapter exportiert sie jeweils als DOCX, XLSX, PPTX, PNG und JSON und ergänzt eine portable Dateinamenerweiterung. Ordner werden durchlaufen, aber nicht als leere Objekte hochgeladen, sofern sie keine Datei enthalten.

Bei der Konvertierung können sich Schriftarten, Formeln, Kommentare, eingebettete Objekte, das Seitenlayout und der Bearbeitungsverlauf ändern. Die Google-Exportendpunkte unterliegen außerdem Format- und Größenbeschränkungen. Das Skript überspringt nicht unterstützte native Typen mit einer Warnung, anstatt eigenmächtig eine Darstellungsform zu erzeugen. Prüfen Sie eine repräsentative Auswahl konvertierter Dateien manuell.

Verknüpfungen, geteilte Ablagen, für Sie freigegebene Dateien außerhalb von „Meine Ablage“, OneNote-Pakete, Aufbewahrungsmetadaten der Organisation, Versionsverläufe und Freigabe-ACLs werden von dieser Version nicht unterstützt. Aufgrund dieser Einschränkungen sollte das Kopieren von Dateien nicht als vollständige Mandantenmigration bezeichnet werden.

Exakte Bytes durch vollständiges erneutes Herunterladen vom Ziel überprüfen

Ein erfolgreicher Upload beim Anbieter ist notwendig, aber nicht ausreichend. Nach dem Upload vergleicht das Skript zunächst die in den Zielmetadaten angegebene Größe mit der bereitgestellten Datei. Im standardmäßigen Modus mit erneutem Download lädt es anschließend das Zielobjekt in eine temporäre Datei im selben Verzeichnis herunter, berechnet SHA-256 und vergleicht diesen Hashwert mit dem Hashwert der bereitgestellten Quelldatei.

Nur wenn sowohl die Größe als auch der Hash übereinstimmen, wird ein Checkpoint-Eintrag erstellt. Der Checkpoint erfasst Quell-ID, von der Quelle gemeldete Größe, Ziel-ID, Zielpfad, tatsächliche Bytes, beide Hashwerte und den Abschlusszeitpunkt in UTC. Verweist ein im Checkpoint erfasster Quellpfad später auf eine andere ID oder Größe, hält das Skript an, statt geänderte Daten unbemerkt zu überspringen.

Das erneute Herunterladen verdoppelt den Lesedatenverkehr auf der Zielseite und erfordert vorübergehend Speicherplatz sowohl für die zwischengespeicherte Datei als auch für die Prüfkopie. Wählen Sie den Metadatenmodus nur, wenn Ihnen diese Kosten bewusst sind und ein unabhängiges Verfahren zur Inhaltsüberprüfung vorhanden ist.

Bytegenaue Überprüfung am Zielort
destination.redownload(uploaded, verification_copy)
verification_hash = sha256_file(verification_copy)
if verification_hash != local_hash:
    raise RuntimeError(
        f"SHA-256 mismatch after destination re-download: {relative!r}."
    )

state["completed"][relative] = {
    "source_id": item.id,
    "destination_id": uploaded.id,
    "bytes": actual_size,
    "sha256": local_hash,
    "destination_sha256": verification_hash,
}

Fortsetzen, ohne Ungewissheit als Erfolg zu werten

Das Programm schreibt den Status atomar über eine temporäre Datei und anschließendes Umbenennen. Ein überprüftes Element wird erst nach diesem dauerhaften Schreibvorgang aus der lokalen Zwischenablage entfernt. Wird derselbe Befehl erneut ausgeführt, überspringt das Programm die im Checkpoint erfassten Elemente und fährt mit den ausstehenden Pfaden fort.

Ein Absturz kann auftreten, nachdem der Anbieter einen Upload angenommen hat, aber bevor der Prüfpunkt geschrieben wurde. Da das Konfliktverhalten auf „fail“ gesetzt ist, hält der nächste Durchlauf bei diesem bereits vorhandenen Zielpfad an, anstatt ihn zu überschreiben oder fälschlicherweise Erfolg zu melden. Untersuchen und vergleichen Sie das Objekt. Fügen Sie anschließend entweder mit der nötigen Sorgfalt einen verifizierten Wiederherstellungseintrag hinzu oder starten Sie erneut mit einem neuen Zielstammordner.

Bei abgelaufenem OAuth-Zugriff, Ratenbegrenzungen, vorübergehenden Serverfehlern und unterbrochenen Blöcken werden innerhalb festgelegter Grenzen Wiederholungsversuche unternommen. Authentifizierungsfehler oder dauerhafte Berechtigungsfehler beenden das Programm. Bewahren Sie Protokolle, Prüfpunkt und den Inhalt des Bereitstellungsbereichs auf, bis Sie die Ursache des Fehlers verstanden haben.

Einen echten Abnahmetest durchführen

  • Beginnen Sie mit einem kleinen Ordner, der leere und große Dateien, tief verschachtelte Pfade, Unicode-Namen und native Google-Dokumente enthält.
  • Führen Sie zuerst --dry-run aus und vergleichen Sie die Gesamtzahl der Bytes im Inventar mit der Anbieteroberfläche.
  • Überwachen Sie während des ersten produktiven Batches den freien lokalen Speicherplatz und das Speicherkontingent am Ziel unabhängig voneinander.
  • Lassen Sie die Verifizierung durch erneutes Herunterladen aktiviert und archivieren Sie den Prüfpunkt zusammen mit Ihren Migrationsunterlagen.
  • Öffnen Sie am Zielort eine repräsentative Auswahl an PDFs, Office-Dateien, Bildern, Videos, Archiven und konvertierten nativen Dokumenten.
  • Vergleichen Sie die erwartete Anzahl von Ordnern und Dateien, untersuchen Sie jedes übersprungene oder fehlgeschlagene Element und testen Sie den Zugriff mit einem zweiten Benutzerkonto.
  • Lassen Sie die Quelle während eines festgelegten Überschneidungszeitraums unverändert. Dieses Skript löscht sie niemals.

Häufig gestellte Fragen

Löscht das Python-Skript jemals Quelldateien?

Nein. Das Löschen an der Quelle ist nicht implementiert. Die Engine lädt Daten von der Quelle herunter und schreibt sie in einen separaten Zielstammordner. Bei erfolgreicher Verifizierung wird lediglich die temporäre lokale Bereitstellungskopie entfernt.

Kann das Skript Dateien in beide Richtungen übertragen?

Ja. Legen Sie Google Drive oder OneDrive als Quelle und den jeweils anderen Anbieter als Ziel fest. Verwenden Sie für jede Migration einen eigenen Checkpoint und Zielstammordner.

Bleiben Freigabeberechtigungen und Dateiverläufe erhalten?

Nein. Diese Version kopiert die aktuellen Dateiinhalte und Ordnerpfade. Freigabe-ACLs, öffentliche Links, Versionen, Kommentare, Bezeichnungen, Aufbewahrungsrichtlinien und organisationsspezifische Metadaten müssen separat migriert und überprüft werden.

Warum gerade hochgeladene Dateien erneut herunterladen?

Die Annahme des Uploads und die in den Metadaten angegebene Größe belegen nicht, dass exakt dieselben Bytes vom Ziel zurückgelesen werden können. Der Modus zum erneuten Herunterladen berechnet SHA-256 über den Zielinhalt und speichert nur bei exakter Übereinstimmung einen Checkpoint.

Ist dies ein offizielles Tool von Google oder Microsoft?

Nein. Es handelt sich um eine unabhängige Referenzimplementierung von FileArk, die unter der MIT-Lizenz veröffentlicht wurde. Prüfen Sie den Code, testen Sie ihn mit unkritischen Daten und beachten Sie die Richtlinien Ihres Anbieters und Ihrer Organisation.

Für diese Anleitung verwendete offizielle Ressourcen

Anleitung lesen