thilo-55
Goto Top

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 face-wink

LG Thilo

Content-Key: 360572

Url: https://administrator.de/contentid/360572

Printed on: April 25, 2024 at 12:04 o'clock

Member: falscher-sperrstatus
falscher-sperrstatus Jan 10, 2018 at 12:12:52 (UTC)
Goto Top
Hallo Thilo,

was ergab die Suche nach File/Folder Dublettenprüfung?

VG
Member: thilo-55
thilo-55 Jan 10, 2018 at 12:17:10 (UTC)
Goto Top
Hallo certifiedit.net,

sorry wenn ich blöd nachfragen muss: Was meinst Du genau damit? Suche mit div. Tools wie z.B. AllDup o.ä. sucht "nur" nach doppelten Dateien.
Oder meinst Du das nicht?

LG
Mitglied: 135111
Solution 135111 Jan 10, 2018 updated at 12:36:38 (UTC)
Goto Top
Powershell
gci 'd:\root' -Directory -Recurse | group {$_.GetFiles().Name} | ?{$_.Count -ge 2}  
Member: emeriks
emeriks Jan 10, 2018 updated at 12:38:13 (UTC)
Goto Top
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?
  1. Ein Ordnerpfad und dann nach dessen Dupletten suchen, oder
  2. nur ein Stamm-Ordner und darunter nach beliebigen Dupletten suchen?
Fall 1 ist einfacher.
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.
Member: thilo-55
thilo-55 Jan 10, 2018 at 13:03:28 (UTC)
Goto Top
Hallo fuerte,
erst mal danke für dein script - leider kann ich dazu garnix sagen, da meine powershell-kenntnisse = 0 sind.
hmm, d:\root bezieht sich wohl aber auf drive d: ?
ok, ich werde es mal testen und mich dann melden.

LG Thilo
Member: thilo-55
thilo-55 Jan 10, 2018 at 13:06:17 (UTC)
Goto Top
Hallo emeriks,

danke - ja, ist klar, dass das wohl doch nicht so profan ist, zumal ich Fall 2 benötige.
Aber AllDupe oder FreeFileSync arbeitet ja auch mit Katalogisierung - und es müssem ja nicht 100.000 Ordner sein...

LG Thilo
Member: emeriks
emeriks Jan 10, 2018 at 13:09:49 (UTC)
Goto Top
da meine powershell-kenntnisse = 0 sind.
Schlechte Voraussetzung.
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.
Member: thilo-55
thilo-55 Jan 10, 2018 at 13:16:26 (UTC)
Goto Top
face-wink
hm, ok,
ohne dem vorgreifen zu wollen, hätte ich fast die Vermutung gehabt, dass es mit nur einer Zeile Code nicht unbedingt funktioniert...
Member: emeriks
emeriks Jan 10, 2018 at 13:22:02 (UTC)
Goto Top
Mitglied: 135111
135111 Jan 10, 2018 updated at 13:42:07 (UTC)
Goto Top
Zitat von @emeriks:
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.
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.
Member: thilo-55
thilo-55 Jan 10, 2018 at 13:46:26 (UTC)
Goto Top
Hallo Ihr Zwei,

nochmals besten Dank zwischendurch.

@emericks: die beiden Links beziehen sich wohl aber mehr auf Fall1, denke ich (nach überfliegen).

@135111: nix für ungut, wie gesagt: habe von powershell null Ahnung, ich test auf jeden Fall und melde mich - kann aber a bisserl dauern.
Member: emeriks
emeriks Jan 10, 2018 updated at 14:07:11 (UTC)
Goto Top
Habe Stammordner mit Daten "D:\Temp".
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}  
liefert ...
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...}
Und was bringt mir das?

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}
Member: thilo-55
thilo-55 Jan 10, 2018 updated at 14:48:34 (UTC)
Goto Top
so, hab mir doch schnell mal die zeit abgerungen zumindest kurz zu testen.
also:
das script von 135111 aka fuerte funktioniert bei mir zumindest prinzipiell
allerdings ist es so, dass auch ordner als gleich ausgegeben werden, wenn unterschiedliche unterordner darunter hängen - das soll so nicht sein, denn schließlich sind diese ordner ja dann nicht gleich.
außerdem gibt das script kein pfad der gefundenen ordner an, somit ist es nicht praxistauglich.
ok, habe ich SO auch nicht in die problemstellung geschrieben - also asche auf mein haupt.
evtl. kannst du mir ja nochmals diesbezüglich behilflich sein, 135111? wäre super nett

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?
Member: emeriks
emeriks Jan 10, 2018 updated at 15:19:16 (UTC)
Goto Top
das script von 135111 aka fuerte
Ihm/Ihr einmal widersprochen und schon flüchtet er/sie ...
Member: emeriks
emeriks Jan 10, 2018 at 15:21:47 (UTC)
Goto Top
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 ...

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?
Member: thilo-55
thilo-55 Jan 11, 2018 at 07:47:56 (UTC)
Goto Top
Moin,

erwartungsgemäß face-wink

d:\Ordner_1 und d:\Ordner_2 mit jew. aaa.txt und bbb.txt sowie
d:\Ordner_3 und d:\Ordner_4 mit jew. xxx.txt und yyy.txt

gci 'd:\' -Directory -Recurse | group {$_.GetFiles().Name} | ?{$_.Count -ge 2}  

ergibt

Count Name                      Group
----- ----                      -----
    2 aaa.txt bbb.txt           {Ordner_1, Ordner_2}
    2 xxx.txt yyy.txt           {Ordner_3, Ordner_4}

Win7Pro Sp1
Member: Pedant
Pedant Jan 11, 2018 at 08:43:59 (UTC)
Goto Top
Hallo emeriks,

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}  
liefert ...
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}  
liefert ...
PS C:\Windows\System32> gci 'd:\Temp' -Directory -Recurse | group {$_.GetFiles().Name} | ?{$_.Count -ge 2}  
...

'd:\root' versus 'd:\Temp'

Gruß Frank
Member: thilo-55
thilo-55 Jan 11, 2018 at 10:24:47 (UTC)
Goto Top
Hi Frank,
genau, das passt - m.E.
Deshalb auch meine Anmerkung bezüglich Test-Umfeld bei emeriks...
Aber wie gesagt: Leider ist das so i.d. Praxis nicht einsetzbar.

Habe da noch was gefunden, was ich mir mal genauer ansehen muss:
Identische Ordner(!) finden
Der shot sieht schon mal gut aus soweit...

Scheinbar bestätigt sich meine Vermutung, dass es wohl doch kein Praxis-Tool mit GUI ähnlich AllDup o.ä. gibt

LG Thilo
Member: emeriks
emeriks Jan 11, 2018 at 10:59:26 (UTC)
Goto Top
Ich habe eine reale Ordnerstruktur genommen und dort diese beiden Test-Ordnern platziert! Ich denke, dass meine Umgebung diesbzgl. also voll aussagekräftig ist.
Member: Pedant
Pedant Jan 11, 2018 at 11:01:58 (UTC)
Goto Top
Hallo Thilo,

Zitat von @thilo-55:
Leider ist das so i.d. Praxis nicht einsetzbar.
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 mit
dir /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
Member: Pedant
Pedant Jan 11, 2018 at 11:06:49 (UTC)
Goto Top
Hallo emeriks,

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 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
Member: colinardo
colinardo Jan 11, 2018 updated at 11:45:39 (UTC)
Goto Top
Die Zeile von @135111 hat ein paar Fehler, richtig müsste sie so aussehen für einen reinen Namensvergleich der Dateien der Ordner:
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)"}  
Für einen reinen Hash-Vergleich der Dateien der Ordner:
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)"}  
Kombinieren kann man das beliebig wenn man es unbedingt als Einzeiler braucht.
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 face-wink.

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
Member: thilo-55
thilo-55 Jan 11, 2018 at 11:46:04 (UTC)
Goto Top
@ Frank: klar könnte ich die Ordner dann suchen, aber mach das mal für vllt. 200
@ emeriks: vllt. wurden bei dir u.U. noch andere "gleiche Ordner" außer den für den Test angelegten gefunden?
@ Uwe: Hi, leider verursacht Dein Script bei mir nen Überlauf

LG Thilo
Member: colinardo
colinardo Jan 11, 2018 updated at 11:53:11 (UTC)
Goto Top
Ich sage ja für ganze Laufwerke ist der Einzeiler eher ungeeignet, schon weil Powershell nicht mehr wie 260 Zeichen Pfadtiefe abkann. Funktionieren tut er aber (getestet).

Du solltest natürlich unbedingt eine aktuelle Powershell-Verison verwenden!
Member: thilo-55
thilo-55 Jan 11, 2018 at 11:53:12 (UTC)
Goto Top
hm, ok, schade...
ich werde mir mal das obige Java bzw. dein link-tool ansehen.
erstmal vielen Dank dafür...
Member: colinardo
colinardo Jan 11, 2018 updated at 11:55:42 (UTC)
Goto Top
Noch zur Info: Wenn du Windows 7 verwendest ist deine Powershell-Version sicherlich nicht auf dem aktuellen Stand wenn du noch nie was mit Powershell gemacht hast. Die Powershell muss man immer selber aktualisieren das macht Windows-Update nicht selbst.
Member: thilo-55
thilo-55 Jan 11, 2018 updated at 12:03:22 (UTC)
Goto Top
ja, tut - sogar mit pfad! - feine sache!
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.

und danke für die info mit dem powershell-update...
Member: colinardo
colinardo Jan 11, 2018 updated at 12:06:35 (UTC)
Goto Top
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 face-smile.
Member: thilo-55
thilo-55 Jan 11, 2018 updated at 14:53:22 (UTC)
Goto Top
Hi Uwe,
ist richtig, dafür hab ich auch schon weiter oben abbitte geleistet - hab am anfang nicht 'dran gedacht.
mir ist aber noch was aufgefallen: die dateigrößen bleiben beim namen-vergleichen unberücksichtigt, aber beim hash-vergleich sieht das wirklich gut aus!
ok, im nachhinein hätte ich den Beitrag vllt. "IDENTISCHE Verzeichnisse finden" nennen sollen... face-sad

das compare-tool sieht gut aus - allerdings muss ich auch hier wohl die zu vergleichenden ordner manuell vorgeben...
Member: colinardo
Solution colinardo Jan 11, 2018 updated at 15:44:03 (UTC)
Goto Top
Also als Kompromiss zum Hashing könntest du hier Name,LastWriteTime und Größe zusammen als Kriterium heranziehen
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 FileHashing lässt sich auch dort zusätzlich noch über das erste Ergebnis mit einbauen wenn du das wolltest.
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.
Member: thilo-55
thilo-55 Jan 12, 2018 at 11:49:38 (UTC)
Goto Top
Hallo Uwe,
jetzt sieht das Ergebnis von Deinem Script aber mal richtig gut aus!
Das mit den Unterordnern hast Du auch erledigt - ich bin total begeistert!
Vielen herzlichen Dank an Dich - und auch Danke an alle anderen, die sich hier beteiligt haben.
Wünsche allen ein schönes und entspanntes WE.

Dafür hat das Tool auch eine Kommandozeilenfunktion.
hört sich gut an - werde mich mal damit befassen...

LG Thilo
Member: colinardo
colinardo Jan 12, 2018 updated at 11:54:43 (UTC)
Goto Top
Freut mich da es dir hilft. Ebenfalls schönes Wochenende.