Verzeichnisunabhängige Suche nach Dateien, die in einem anderen Verzeichnisbaum nicht existieren

Registriert
Mai 2008
Beiträge
157
Hallo zusammen,

gegeben seien zwei Verzeichnisse, nennen wir sie C:\VZ1 und C:\VZ2. Beide Verzeichnisse enthalten tief verzweigte Unterverzeichnisstrukturen, über den Daumen jeweils 1.000 Unterverzeichnisse mit insgesamt 100.000 Dateien.

Ich suche nun ein Tool (Kommandozeile oder GUI ist egal), das mir alle Dateien im Verzeichnis C:\VZ2 samt dem kompletten Pfad) auflistet, die sich nicht irgendwo unterhalb von C:\VZ1 befinden. Dabei sollen zwei Dateien als identisch betrachtet werden, wenn sowohl Änderungszeitpunkt und Größe gleich sind, der Dateiinhalt muss nicht überprüft werden, der Dateiname soll explizit nicht in die Identitätsprüfung eingehen.

Ich habe es schon mit ein paar meiner Lieblingsprogramme versucht, darunter AllDup und WinMerge, es damit jedoch nicht hingekriegt. Insbesondere die Anforderung, dass eine Datei in den Untiefen von C:\VZ2 in allen Unterverzeichnissen von C:\VZ1 sein könnte, sind bisher all meine Versuche gescheitert.

Hat jemand eine Idee? Zur Verfügung stehen Windows 10 und 11 Professional 64 Bit.

Danke :)
 
Verzeichnisse mit Unterstruktur kann man mit Total Commander vergleichen.. Wenn dir so was reicht. Da sieht man, was link oder rechts fehlt, was gleich oder ungleich ist.
 
  • Gefällt mir
Reaktionen: madmax2010
Was ich mich frage:
Wenn zwei Dateien zufälligerweise verschiedene Änderungsdatumsangaben hätten, aber dennoch identisch, würdest du sie als unterschiedlich erkennen wollen?

Ich würde vermutlich Hashes über alles berechnen lassen und dann identische raussuchen.

oicfar schrieb:
Verzeichnisse mit Unterstruktur kann man mit Total Commander vergleichen.. Wenn dir so was reicht. Da sieht man, was link oder rechts fehlt, was gleich oder ungleich ist.
Nur anhand Größe und Änderungsdatum?
 
TotalCommander & BeyondCompare kosten Geld.
Ich finde das immer ungelungen solche ohne diesen Hinweis vorzuschlagen (womit ich nichts gegen die Progs sagen will).
FreeFileSync sollte genügen.

Skripte - was machst du mit Textwüsten die du lesen musst (optimal wenn in Datei gepiped) und dann das Spiel anfängt ein Löschen damit zu initiieren. Dabei mag ich Skripte durchaus.

CN8
 
tollertyp schrieb:
Was ich mich frage:
Wenn zwei Dateien zufälligerweise verschiedene Änderungsdatumsangaben hätten, aber dennoch identisch, würdest du sie als unterschiedlich erkennen wollen?
Es geht im wesentlichen um Bild- und Videodateien. Die Wahrscheinlichkeit, dass zwei Dateien denselben Timestamp und dieselbe Größe haben, dürfte hier verschwindend gering sein. Wenn keine Zugriffe auf den Dateiinhalt notwendig sind, dürfte das die ganze Aktion erheblich beschleunigen, da zum Auslesen von Größe und Änderungs-Timestamp ja nur das Inhaltsverzeichnis gelesen werden und nicht jede Datei geöffnet werden muss.

FreeFileSync ist mir bei meinen Recherchen auch immer wieder begegnet, das habe ich wegen seines Namens vielleicht voreilig aussortiert, da ich ja nicht synchronisieren möchte und schon gar keine ganzen Verzeichnisstrukturen.

Beyond Compare kannte ich tatsächlich noch nicht., Gucke mir beides an. Auch der PowerShell-Dreizeiler liest sich gut, mal gucken, ob ich den für meine Bedürfnisse angepasst kriege.

Danke schon mal bis hierher an alle Beitragsschreiber. :)
 
Naja, der Dreizeiler in der PS ist halt nur ein Dreizeiler, weil er nicht im Ansatz macht, was du brauchst.

Da müsstest du schon enorm tweaken, damit es das macht, was du willst

Hast du dir mal dupeguru angeschaut? Eigentlich ist das genau für sowas gemacht. Das prüft aber gegen den Dateiinhalt. Wenn es clever prüft, ist das aber nicht schlimm, denn die gleiche Größe ist ja Voraussetzung für eine mögliche Gleichheit.

Mir ist übrigens nicht klar, wie FreeFilesync da ans Ziel führt?
Ergänzung ()

Ach ja, und egal welches Tool du nimmst, ich würde wohl zum Testen eine kleine Versuchsverzeichnisstruktur anlegen und da schauen, ob die Tools dann dieses Szenario "erfolgreich meistern", bevor ich sie auf den großen Datenbestand loslasse.
 
Warum soll's der Dreizeiler nicht machen? Ist es nicht das, was der TE möchte?
1692639910669.png
 
Den Hinweis, dass die beiden Dateien für den TE identisch sind, habe ich leider zuerst übersehen:
1692640848233.png


Moment, ich sehe ihn immer noch nicht.
 
Okay, das war's.
1692641218155.png


Moment, doch nicht.

Da kann dupeGuru nicht mithalten...
1692641387637.png


Ach ja, falls du dupeGuru nimmst, den großen Ordner als "Referenz" bei dupeGuru einstellen, damit er nicht nach Duplikaten da drin sucht. In dem als "normal" eingestellten Ordner findet er auch Duplikate, die sich auf den Ordner selbst beziehen.
 
  • Gefällt mir
Reaktionen: Daloop
Danke nochmals für alle Hinweise. DupeGuru kannte ich in der Tat noch nicht, gucke ich mir ebenfalls an.

Mittlerweile habe ich die PowerShell-Lösung ein wenig angepasst, damit sollte ich es auf jeden Fall hinkriegen. Den Parameter -IncludeEqual brauche ich vermutlich nicht und nach SideIndicator kann ich ja gut filtern, da ich ja nur die Dateien in C:\VZ2 haben möchte, die in C:\VZ1 nicht vorhanden sind und mich somit nur eine Richtung interessiert. Dennoch könnten sich die beiden GUI-Tools als nützlich erweisen, insbesondere dann, wenn sich das Ganze als ein iterativer Prozess herausstellen sollte (was ich vermute). Es ist nicht meine eigene Verzeichnisstruktur ;)

(Natürlich werde ich das Ganze zunächst an einer Teststruktur mit wenigen 1000 Dateien ausprobieren.)
 
tollertyp schrieb:
Mir ist übrigens nicht klar, wie FreeFilesync da ans Ziel führt?
Indem es vergleicht und schön handlich die Vergleiche auflistet.
(Bei den Mengen glaube ich aber ganz ehrlich an kein Tool wirklich helfen zu können. Und an Skripte noch weniger.)

Daloop schrieb:
Warum soll's der Dreizeiler nicht machen? Ist es nicht das, was der TE möchte?
Da hast du also die Liste ausgeworfen bekommen. Und dann? Was machst du damit, wie wertest du sie aus, wie nutzt du sie aus? Wie überblickst du sie?

SchwarzerKater schrieb:
(Natürlich werde ich das Ganze zunächst an einer Teststruktur mit wenigen 1000 Dateien ausprobieren.)
😇
Das dazu…
»Ordnung ist das halbe Leben« - damit wurde ich von meine Altvorderen geärgert. Ordner heißen nicht umsonst so, ›sprechende Namen‹ dito. Diesen Wust auseinanderzufrickeln - viel Glück.
Ob es was bringt nicht über die volle Größe zu gehen - kannst nur du wissen welche Unterordner vielleicht schon mal umgeräumt werden könnten.

CN8
 
cumulonimbus8 schrieb:
Da hast du also die Liste ausgeworfen bekommen. Und dann? Was machst du damit, wie wertest du sie aus, wie nutzt du sie aus? Wie überblickst du sie?
Man könnte, anstatt einfach nur ne Liste auszugeben, das Vergleichsobjekt bzw. den SideIndicator auswerten und entsprechende Aktionen folgen lassen. Zum Beispiel die fehlenden Dateien/Ordner in den Backup-Ordner kopieren (ungetestet):

Code:
$fso = Get-ChildItem -Recurse -path C:\Icons1
$fsoBU = Get-ChildItem -Recurse -path C:\Icons2
$result = Compare-Object -ReferenceObject $fso -DifferenceObject $fsoBU -Property Length, LastWriteTime -PassThru | select FullName, Length, LastWriteTime, sideindicator
if($result -ne $null){
    foreach ($item in $result){
        if ($item.SideIndicator.Equals("<=")){
            Copy-Item -Path $item.FullName -Destination "C:\Icons2"
        }
    }
}
 
Zuletzt bearbeitet:
cumulonimbus8 schrieb:
Indem es vergleicht und schön handlich die Vergleiche auflistet.
Und wie sehen die konkret aus? Ist es so schwer, es zu visualisieren?

@Daloop:
Das überträgt aber nur in eine Richtung. Und schön wird es, wenn zwei Dateien mit gleichem Namen aber unterschiedlichem Inhalt kommen...
 
Habe nun einiges ausprobiert: FreeFileSync und dupeGuru nützen mir für meinen geplanten Einsatzzweck nichts; es war dennoch gut, diese Programme kennengelernt zu haben. Doch der PowerShell-Dreizeiler ist tatsächlich ein Volltreffer, ich habe ihn ein wenig erweitert und nun bekomme ich das, was ich möchte: Eine Liste aller Dateien unterhalb von C:\VZ2, die unterhalb von C:\VZ1 nicht vorhanden sind. Was ich mit dieser Liste mache, muss ich noch sehen, doch in PowerShell kann ich sie ja beliebig weiterverwursten.

Das Script lief übrigens mit 130.000 Dateien in C:\VZ1 und 60.000 Dateien in C:\VZ2 ca. 2 Stunden auf meinem i5-12500. Im Taskmanager sieht man sehr schön, dass Plattenzugriffe nur in den ersten 30 Sekunden stattfinden (auf einer per USB 3 eingebundenen HDD!), dann ist vermutlich die ganze Struktur mit Dateigrößen, -Timestamps und -Namen im RAM aufgebaut. Der Rest ist reine CPU-Angelegenheit, wobei leider nur ein Kern verwendet wird; vermutlich könnte ich das Ganze auf meinem Sechskerner nochmals erheblich beschleunigen, wenn ich mehrere PowerShell-Prozesse parallel starte und jeden ein Unterverzeichnis von C:\VZ2 bearbeiten lasse.

cumulonimbus8 schrieb:
»Ordnung ist das halbe Leben« - damit wurde ich von meine Altvorderen geärgert. Ordner heißen nicht umsonst so, ›sprechende Namen‹ dito. Diesen Wust auseinanderzufrickeln - viel Glück.
Ob es was bringt nicht über die volle Größe zu gehen - kannst nur du wissen welche Unterordner vielleicht schon mal umgeräumt werden könnten.

Das ist nicht meine eigene Platte (da herrscht Ordnung :)), sondern das Resultat von Backups unterschiedlicher PCs in unterschiedlicher Verzeichnisse und mehrerer angefangener, aber nicht beendeter Aufräumversuche in einem kleinen Netzwerk.

Meine grundsätzliche Anforderung betrachte ich damit als erfüllt. Danke an alle Mitdiskutanten 👍
 
  • Gefällt mir
Reaktionen: Daloop und konkretor
tollertyp schrieb:
@Daloop:
Das überträgt aber nur in eine Richtung.
Mit einer weiteren If-Bedingung für den SideIndicator "=>" geht's auch in die andere Richtung.
tollertyp schrieb:
Und schön wird es, wenn zwei Dateien mit gleichem Namen aber unterschiedlichem Inhalt kommen...
Mit dem Argument "-Properties Length, LastWriteTime" sollten nur Größe und Änderungsdatum der Dateien vom Comparer ausgewertet werden, nicht der Dateiname.
 
Daloop schrieb:
Man könnte, anstatt einfach nur ne Liste auszugeben, das Vergleichsobjekt bzw. den SideIndicator auswerten und entsprechende Aktionen folgen lassen.
😁 und schon sind wir bei mehr als drei Zeilen.
Ich weiß was Skripte können, aber die müssen auch passen (unmittelbar aus der Hand..?) und sind eben ein bestimmter Aufwand.

tollertyp schrieb:
Und wie sehen die konkret aus? Ist es so schwer, es zu visualisieren?
Solche Textwüsten? Ich meine schon.

SchwarzerKater schrieb:
sondern das Resultat von Backups unterschiedlicher PCs in unterschiedlicher Verzeichnisse und mehrerer angefangener, aber nicht beendeter Aufräumversuche in einem kleinen Netzwerk.
Mein Beileid & viel Glück!! 👍

CN8
 
Daloop schrieb:
Mit dem Argument "-Properties Length, LastWriteTime" sollten nur Größe und Änderungsdatum der Dateien vom Comparer ausgewertet werden, nicht der Dateiname.
Und das Copy überschreibt dann gnadenlos...

@SchwarzerKater: Deshalb würde ich wohl den Weg über die Hash-Berechnung gehen.
Dauert auch seine Zeit, aber dann musst du halt nur noch Dubletten in den Hashes finden und hast da sogar noch die Gewissheit, dass bei gleicher Größe und gleichem Hash die Datei mit ziemlicher Sicherheit auch wirklich identisch ist.

Alternativ mit PowerShell halt die Attribute ausgeben (bzw. in eine Datei schreiben), die relevant sind (Größe, Datum) mit Zuordnung zu Name und dann dort halt nach Dubletten suchen.
 
Zurück
Oben