Stellen Sie sicher, dass es sich bei dem Download nicht um eine Fälschung handelt

Stellen Sie sicher, dass es sich bei dem Download nicht um eine Fälschung handelt

Ich möchte ein Verzeichnis mit Dateien (rekursiv) von einem WebDav-Server an einen Speicherort herunterladen. Wenn die Datei bereits (irgendwo dort) vorhanden ist, soll sie nicht erneut heruntergeladen werden. Die Ordnerstruktur ist jedoch nicht dieselbe.

Gibt es eine einfache Möglichkeit, das zu tun? Ich habe mir fdupes angesehen, aber es dient nur zum Erkennen und Löschen von Duplikaten. Die Dateien sind sehr groß und der Aufwand wäre viel zu groß.

Das Zieldateisystem unterstützt keine Deduplizierung. Ich weiß cp -n(von einem FUSE-Mountpoint), dass die vorhandenen Dateien nicht überschrieben werden, aber die Ordnerstruktur ist nicht dieselbe. Ich stecke also irgendwie fest.

Antwort1

Vom Betrachtendie verfügbaren Linux-Clients für WebDAV, meine eigene bevorzugte Methode hierfür wäre:

  1. Verwenden Sie GVFS oder eines der WebDAV-Dateisystemmodule (davfs2 oder fusedav), um die Dateien des Remote-WebDAV-Servers in den lokalen Dateisystempfad zu „zuordnen“.

  2. Nutzen Sie die integriertecpBefehl mit der -nOption, ihn anzuweisen, Dateien im Ziel „nicht zu überschreiben“. Beachten Sie, dass bestimmte Shells, wie z. B. auf Ubuntu, standardmäßig eine Version von dashausführen und diese integrierte Funktion die Option möglicherweise nicht unterstützt. Um optimale Ergebnisse zu erzielen, stellen Sie sicher, dass Sie die GNU Coreutils-Version von ausführen, indem Sie oder ausführen (je nachdem, wo sich die Binärdatei auf Ihrem spezifischen System befindet).builtincp-ncp/bin/cp/usr/bin/cp

EDIT: Ich habe Ihre ursprüngliche Frage falsch gelesen.

Ich denke, was Sie sagen, ist, dass Sie die Situation haben, in der die Datei file1.txtin zwei verschiedenen Pfaden im WebDAV-Server vorhanden ist, und dieInhaltdieser beiden Dateien ist genau gleich. Und da Sie bereits eine Kopie der Datei haben, möchten Sie keine zweite oder dritte Kopie der Datei herunterladen, weil das Bandbreite verschwendet?

Also,von der Clientseite, das wäre sehr schwer umzusetzen. Hier ist der Grund.

Man muss sich ansehenwas vergleichst duum festzustellen, ob die Datei eindeutig ist, und dieAnforderungen/Kostenum diesen Vergleich anzustellen.

ICHvermutet(fälschlicherweise), dass das, was Sie verglichen haben, dasWegrelativ zum Stamm der WebDAV-Ordnerstruktur. Der Aufwand für einen Pfadgleichheitsvergleich ist sehr einfach: Sie sehen sich einfach die beiden Pfadzeichenfolgen an, z. B. /dir1/dir2/file1.txt, und prüfen, ob die Zeichenfolgen übereinstimmen. Wenn dies der Fall ist, handelt es sich um ein Duplikat. Wenn nicht, ist es kein Duplikat.

Eine weitere Vergleichsmöglichkeit besteht in der DateiName, ohne Berücksichtigung derWeg. Würden Sie beispielsweise diese beiden Dateien als Duplikate betrachten: /dir1/dir2/file1.txtund /dir3/dir4/file1.txt? Nun, wenn SienurVergleichen auf der Grundlage derName, dann werden diese als Duplikate betrachtet. Wir können jedoch verschiedene Tests auf Duplizierung beliebig kombinieren, um den richtigen Test für unseren Anwendungsfall zu finden.

Andere, weniger nützliche Eigenschaften zum Vergleichen sindDateigröße,Attribute(auch bekannt alsMetadaten), Dateierweiterung usw. Diese Dinge geben Ihnen nicht viel Anhaltspunkt für die Beurteilung von Duplikaten, da es in den meisten Fällen einfach ist, eine Datei zu erstellen, die dieselben Eigenschaften wie eine andere Datei, aber völlig andere Inhalte hat, und die meisten Leute würden die beiden Dateien nicht als Duplikate betrachten, wenn die Inhalte unterschiedlich sind.

Meiner Meinung nach ist das Wichtigste, was Sie vergleichen können, die DateiInhalt. Leider können Sie aus Sicht eines WebDAV-Clients den Dateiinhalt erst erfahren, wenn Sie die Datei bereits heruntergeladen haben. Und was den Client betrifft, könnte sich der Dateiinhalt während oder nach der Dateiübertragung ändern. In diesem Fall würden sich die Ergebnisse des Duplikatsvergleichs ändern, wenn Sie die Datei erneut herunterladen würden.

Es gibt zwei grundlegende Möglichkeiten, Dateiinhalte zu vergleichen:Byte für Byte, UndHashen. Byte für Byte ist die "sicherste" Methode, um nach Duplikaten zu suchen, leidet aber unter der Einschränkung, dass Sie vergleichen müssendie gesamte Datei, was bei großen Datenmengen enorm langsam ist. Bedenken Sie auch, dass die grundlegende algorithmische Komplexität der Duplikatserkennung ist O(n^2), was bedeutet, dass Sie den Inhalt jeder Datei mit dem Inhalt jeder anderen Datei vergleichen müssen, um festzustellen, ob es sich um ein Duplikat handelt. Die Verwendung eines kryptografischen Hashs zum Vergleichen der Dateien kann die Datenmenge, die verglichen oder übertragen werden muss, erheblich reduzieren, aber der Nachteil ist, dass Sie eine infinitesimale Wahrscheinlichkeit einführen, dass zwei Dateien tatsächlichandershaben aber denselben Hash – dies wird als Hash-Kollision bezeichnet.

Aber noch einmal, aus derKlientPerspektive ist es nicht möglich zu wissen,Wasder Dateiinhalt oder sogar sein Hash, es sei denn, Sie verwenden entweder:

  • Laden Sie die Datei vom Server herunter. oder
  • Überzeugen Sie den Server, lokal einen Hash-Wert für Sie zu berechnen, und laden Sie dann den Hash herunter.

Im ersten Fall laden Sie die Datei herunter, um festzustellen, ob es sich um ein Duplikat handelt, um das Herunterladen der Datei zu vermeiden. Das können Sie also offensichtlich nicht tun - Sie verschwenden die Bandbreite, die Sie vermeiden möchten.nur um die Vergleiche durchzuführen!

Im letzteren Fall könnten Sie auf etwas gestoßen sein. Ein SHA1-Hash einer sehr großen Datei ist nur ein paar Bytes groß und stellt einen winzigen Bruchteil der Größe der großen Datei dar. Es wäre ziemlich praktisch, Hashes aller Dateien herunterzuladen und einen Vergleich O(n^2)derHashesum zu bestimmen, welche Datei heruntergeladen werden soll. Es treten jedoch immer noch Race-Condition-Probleme auf, wenn sich die Dateidaten auf dem Server ändern, während Sie diese Vergleiche durchführen. Sie müssen daher sicherstellen, dass Sie die Synchronisierung berücksichtigen, wenn sie für Sie wichtig ist.

Also, Fazit:

  • WENNSie haben keine vollständige Software-Kontrolle über den WebDAV-Server und können keine Änderungen an seiner Konfiguration vornehmen. Sie haben so ziemlich Pech (tm) bei der Feststellung, ob Sie bereits eine Kopie desselben habenDateiinhaltdie in mehreren Dateien auf dem Server gespeichert sind,es sei dennDer Serveradministrator stellt bereits für jede Datei auf dem Server eine Art Hash-Datei zur Verfügung, die Ihnen möglicherweise einen gewissen Erfolg ermöglicht, wenn Sie sich auf die Hash-Werte verlassen können.
  • WENNDuTunhaben die volle Software-Kontrolle über den WebDAV-Server und sindfähigUm die Konfiguration zu ändern, können Sie ein Skript oder Programm schreiben (oder ein bereits vorhandenes verwenden), um eine Hash-Datei mit einer Erweiterung wie z. B. .sha1sumim selben Verzeichnis wie jede vom WebDAV-Server gehostete Datei zu erstellen. Auf diese Weise können Sie nur die Hashes herunterladen und vergleichen, und zwar zu relativ geringen Bandbreitenkosten im Vergleich zur Größe der Dateien, vorausgesetzt, Ihre Dateien sind größer als ein paar Kilobyte.

verwandte Informationen