Gleiche Verzeichnisse finden
Hallo zusammen,
evtl. hat ja jemand einen guten Tipp für für mich - eigentlich dachte ich, die Lösung meines Problems wäre profan und einfach zu finden - aber ich komme nicht weiter.
Problematik:
Ich suche eine Möglichkeit/Tool, welches mir VERZEICHNISSE anzeigt, welche die gleichen Dateien (Name und/oder Inhalt) beinhalten (unabhängig der jew. Verzeichnistiefe).
Einzelne doppelte DATEIEN (für sich) sind unrelevant.
Bsp.:
Im Ordner c:\temp1 befinden sich nur die dateien a.txt und b.txt
Im Ordner c:\user\aaa befindet sich ebenfalls nur die dateien a.txt und b.txt
Im Ordner c:\user\bbb befindet sich die dateien a.txt, b.txt und c.txt
In 2 anderen Ordnern befinden sich jew. NUR die Datei a.txt ODER b.txt
Das Tool sollte als Ergebnis nur den Ordner Temp1 und aaa ausgeben.
Ich hoffe ich konnte mich verständlich ausdrücken
LG Thilo
evtl. hat ja jemand einen guten Tipp für für mich - eigentlich dachte ich, die Lösung meines Problems wäre profan und einfach zu finden - aber ich komme nicht weiter.
Problematik:
Ich suche eine Möglichkeit/Tool, welches mir VERZEICHNISSE anzeigt, welche die gleichen Dateien (Name und/oder Inhalt) beinhalten (unabhängig der jew. Verzeichnistiefe).
Einzelne doppelte DATEIEN (für sich) sind unrelevant.
Bsp.:
Im Ordner c:\temp1 befinden sich nur die dateien a.txt und b.txt
Im Ordner c:\user\aaa befindet sich ebenfalls nur die dateien a.txt und b.txt
Im Ordner c:\user\bbb befindet sich die dateien a.txt, b.txt und c.txt
In 2 anderen Ordnern befinden sich jew. NUR die Datei a.txt ODER b.txt
Das Tool sollte als Ergebnis nur den Ordner Temp1 und aaa ausgeben.
Ich hoffe ich konnte mich verständlich ausdrücken
LG Thilo
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 360572
Url: https://administrator.de/forum/gleiche-verzeichnisse-finden-360572.html
Ausgedruckt am: 20.04.2025 um 02:04 Uhr
32 Kommentare
Neuester Kommentar

Powershell
gci 'd:\root' -Directory -Recurse | group {$_.GetFiles().Name} | ?{$_.Count -ge 2}
Hi,
mit PowerShell geht sowas. Auch mit VBscript.
Aber Vorsicht bei großen, komplexen Ordnerstrukturen. Das kann schnell "überlaufen".
Was sind denn die Eingabe-Parameter?
Fall 2 viel aufwändiger. Hier müsste man zuerst alle Ordner katalogisieren, um dann anschließend alle untereiander zu vergleichen. Bei einer Struktur mit 100.000 Ordnern kannst Du Dir ja ausrechnen, wieviel Kombinationen das ergibt.
E.
mit PowerShell geht sowas. Auch mit VBscript.
Aber Vorsicht bei großen, komplexen Ordnerstrukturen. Das kann schnell "überlaufen".
Was sind denn die Eingabe-Parameter?
- Ein Ordnerpfad und dann nach dessen Dupletten suchen, oder
- nur ein Stamm-Ordner und darunter nach beliebigen Dupletten suchen?
Fall 2 viel aufwändiger. Hier müsste man zuerst alle Ordner katalogisieren, um dann anschließend alle untereiander zu vergleichen. Bei einer Struktur mit 100.000 Ordnern kannst Du Dir ja ausrechnen, wieviel Kombinationen das ergibt.
E.

Zitat von @emeriks:
Doch habe ich. Wenn es nur um die selben Dateinamen geht das damit sehr wohl, du hast den Einzeiler dann fehlinterpretiert! Wenn der Inhalt der Datein noch hinzukommt noch ein bißchen Hashing hinzufügen wäre auch kein Problem.ok, ich werde es mal testen und mich dann melden.
Ich fürchte, @135111 hat Dich nicht ganz verstanden. Dieser Einzeile jedenfalls bringt es nicht.
Habe Stammordner mit Daten "D:\Temp".
Darin 2 Ordner "Test1" und "Test2"
In beiden je eine "Dat1.txt" und eine "Dat2.txt"
liefert ...
Und was bringt mir das?
Edit:
bzw:
Darin 2 Ordner "Test1" und "Test2"
In beiden je eine "Dat1.txt" und eine "Dat2.txt"
gci 'd:\root' -Directory -Recurse | group {$_.GetFiles().Name} | ?{$_.Count -ge 2}
PS C:\Windows\System32> gci 'd:\Temp' -Directory -Recurse | group {$_.GetFiles().Name} | ?{$_.Count -ge 2}
Count Name Group
----- ---- -----
22 abcdefg.exe R... {abcdefg, Test1, Test2, xyzuvw...}
8 {aaaaa, bbbb, cccccc, ddddd...}
Edit:
bzw:
PS C:\Windows\System32> gci 'd:\Temp' -Directory -Recurse | group {$_.GetFiles().Name} | ?{$_.Count -ge 2} | fl
Name : abcdefg.exe Referenzhandbuch.pdf serial.txt
Count : 22
Group : {abcdefg, Test1, Test2, xyzuvw...}
Values : {abcdefg.exe Referenzhandbuch.pdf serial.txt}
Name :
Count : 8
Group : {aaaaa, bbbb, cccccc, ddddd...}
Values : {$null}
emeriks, bist du sicher, dass du im richtigen umfeld testest?
M.E. wird bei dir die dateien abcdefg.exe, Referenzhandbuch.pdf, serial.txt in den ordnern abcdefg, Test1, Test2, xyzuvw... als identsiche Ordner gefunden?
Ich habe auf dem Mond getestet, ja, wo sonst ...M.E. wird bei dir die dateien abcdefg.exe, Referenzhandbuch.pdf, serial.txt in den ordnern abcdefg, Test1, Test2, xyzuvw... als identsiche Ordner gefunden?
Ich habe es genauso getestet wie ich es geschieben habe. Und die Ausgabe ist genauso, wie ich es geschrieben habe.
Client: Win10 Pro 1709
Wie sieht denn Deine Ausgabe aus?
Hallo emeriks,
habe Deine Teststruktur nachgebaut.
Bei mir sieht die Ausgabe so aus:
liefert ...
Du hattest aber merkwürdigerweise geschrieben:
liefert ...
'd:\root' versus 'd:\Temp'
Gruß Frank
habe Deine Teststruktur nachgebaut.
Bei mir sieht die Ausgabe so aus:
PS C:\Windows\System32> gci 'd:\Temp' -Directory -Recurse | group {$_.GetFiles().Name} | ?{$_.Count -ge 2}
Count Name Group
----- ---- -----
2 Dat1.txt Dat2.txt {Test1, Test2}
Du hattest aber merkwürdigerweise geschrieben:
gci 'd:\root' -Directory -Recurse | group {$_.GetFiles().Name} | ?{$_.Count -ge 2}
PS C:\Windows\System32> gci 'd:\Temp' -Directory -Recurse | group {$_.GetFiles().Name} | ?{$_.Count -ge 2}
...
'd:\root' versus 'd:\Temp'
Gruß Frank
Hallo Thilo,
Wieso nicht, was ist denn die Praxis?
Was würdest Du denn mit den gefundenen Ordnern machen?
Falls Du Dir die genauer ansehen willst und dann die tatsächlich inhaltlich doppelten löschen möchtest, dann geht das doch mit diesem Suchbefehl.
Wenn ein Treffer
Nach dem manuellen Löschen kannst Du die Suche erneut ausführen und weitermachen, bis keine Treffer mehr ausgegeben werden.
Vermutlich ließe sich das Skript aber auch so umschreiben, dass es die vollen Pfade ausgibt (auch in eine Datei) und die Liste nicht mit ... abschneidet.
Gruß Frank
Wieso nicht, was ist denn die Praxis?
Was würdest Du denn mit den gefundenen Ordnern machen?
Falls Du Dir die genauer ansehen willst und dann die tatsächlich inhaltlich doppelten löschen möchtest, dann geht das doch mit diesem Suchbefehl.
Wenn ein Treffer
Ordner_1, Ordner_2
heißt, dann müsstest Du noch mitdir /s /b Ordner_1
und dir /s /b Ordner_2
ausgeben lassen, wo diese Ordner zu finden sind.Nach dem manuellen Löschen kannst Du die Suche erneut ausführen und weitermachen, bis keine Treffer mehr ausgegeben werden.
Vermutlich ließe sich das Skript aber auch so umschreiben, dass es die vollen Pfade ausgibt (auch in eine Datei) und die Liste nicht mit ... abschneidet.
Gruß Frank
Hallo emeriks,
Ich habe auch eine reale Ordnerstruktur genommen und die Ordner- und Dateinamen exakt so gewählt wie Du.
Bei mir kam ein sinnvolles Ergebnis raus.
Was ist mit meinem Hinweis?
Übrigens: Alle leeren Ordner werden auch als "gleich" ausgegeben.
Gruß Frank
Zitat von @emeriks:
Ich habe eine reale Ordnerstruktur genommen und dort diese beiden Test-Ordnern platziert! Ich denke, dass meine Umgebung diesbzgl. also voll aussagekräftig ist.
Ich habe eine reale Ordnerstruktur genommen und dort diese beiden Test-Ordnern platziert! Ich denke, dass meine Umgebung diesbzgl. also voll aussagekräftig ist.
Ich habe auch eine reale Ordnerstruktur genommen und die Ordner- und Dateinamen exakt so gewählt wie Du.
Bei mir kam ein sinnvolles Ergebnis raus.
Was ist mit meinem Hinweis?
'd:\root' versus 'd:\Temp'
Übrigens: Alle leeren Ordner werden auch als "gleich" ausgegeben.
Gruß Frank
Die Zeile von @135111 hat ein paar Fehler, richtig müsste sie so aussehen für einen reinen Namensvergleich der Dateien der Ordner:
Für einen reinen Hash-Vergleich der Dateien der Ordner:
Kombinieren kann man das beliebig wenn man es unbedingt als Einzeiler braucht.
.
Wenn du das natürlich auf ein ganzes Laufwerk abfeuerst wird das schon alleine durch das Hashing schon seine Zeit dauern ...
Wenn du viel vergleichst kann ich dir BeyondCompare wärmstens empfehlen, das macht jegliche Art von Vergleichen.
Grüße Uwe
gci 'D:\Ordner' -Dir -Recurse -Force -EA Ignore | group {$_.GetFiles().Name -join '|'} | ?{$_.Count -ge 2 -and $_.Name -ne ''} | %{($_.Group.Fullname -join "`r`n")+"`r`n$('-'*50)"}
gci 'D:\Ordner' -Dir -Recurse -Force -EA Ignore | group {(Get-FileHash "$($_.Fullname)\*" -Algorithm MD5).Hash -join '|'} | ?{$_.Count -ge 2 -and $_.Name -ne ''} | %{($_.Group.Fullname -join "`r`n")+"`r`n$('-'*50)"}
außerdem gibt das script kein pfad der gefundenen ordner an, somit ist es nicht praxistauglich.
Der Dateipfad ist immer in den Objekten in der Eigenschaft Group enthalten er wird aber eben nur auf Anfrage in der Konsole dargestellt, so wie ich es in meinen Skripten oben tue Wenn du das natürlich auf ein ganzes Laufwerk abfeuerst wird das schon alleine durch das Hashing schon seine Zeit dauern ...
Wenn du viel vergleichst kann ich dir BeyondCompare wärmstens empfehlen, das macht jegliche Art von Vergleichen.
Grüße Uwe
Zitat von @thilo-55:
leider jedoch auch so, dass wenn in einem von 2 datei-mäßig zwar gleichen ordner ein weiterer unterordner mit 'drin hängt die beiden odner trotzdem als "gleich" ausgegeben werden.
Das ließe sich anpassen davon war ja im Post oben nicht die Rede leider jedoch auch so, dass wenn in einem von 2 datei-mäßig zwar gleichen ordner ein weiterer unterordner mit 'drin hängt die beiden odner trotzdem als "gleich" ausgegeben werden.
Also als Kompromiss zum Hashing könntest du hier Name,LastWriteTime und Größe zusammen als Kriterium heranziehen
Das FileHashing lässt sich auch dort zusätzlich noch über das erste Ergebnis mit einbauen wenn du das wolltest.
gci 'D:\ordner' -Dir -Recurse -Force -EA Ignore | group {($_.GetFileSystemInfos('*') | %{"$($_.Name)|$($_.LastWriteTime.toString('yyyyMMddHHmmss'))|$($_.Length)"}) -join '|'} | ?{$_.Count -ge 2 -and $_.Name -ne ''} | %{($_.Group.Fullname -join "`r`n")+"`r`n$('-'*50)"}
das compare-tool sieht gut aus - allerdings muss ich auch hier wohl die zu vergleichenden ordner manuell vorgeben...
Dafür hat das Tool auch eine Kommandozeilenfunktion.