goodbytes
Goto Top

Batch oder VBS - Doppelte Dateinamen in einem Verzeichnis finden und löschen oder verschieben

Hallo,
ich habe ein dringendes Problem.

Durch einen Softwarefehler wurden mir in einem Verzeichnis sehr viele doppelte Dateinamen erzeugt (ca. 15.000 Dateien).
Von diesen Dateien sollen die Dubletten gelöscht werden.
Ideal wäre wahrscheinlich der bitweise Vergleich.
Ansonsten sind generell die ersten 16 Stellen des Dateinamens identisch, danach unterscheiden sie sich (Zeitstempel der Erzeugung).
Ich muss möglichst schnell die Dupletten entfernen, damit ich die restlichen Dateien weiterverarbeiten kann!

Vielen dank im Voraus!

Gruß
Torsten

Content-ID: 240710

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

Ausgedruckt am: 22.11.2024 um 04:11 Uhr

emeriks
emeriks 12.06.2014 um 11:46:49 Uhr
Goto Top
Hi,
was sind denn hier "Dupletten"? Du willst immer nur eine Datei von jeder Gruppe mit gleichen ersten 16 Stellen erhalten? Und welche? Die älteste, die jüngste, oder was?
E.
goodbytes
goodbytes 12.06.2014 um 11:49:26 Uhr
Goto Top
Ja genau. Die Dateien sind wirklich identisch und beim Dateiname die ersten 16 Stellen immer gleich. Welche ich nehme ist eigentlich egal. Am besten einfach die erste erstellte Datei.

Gruß
Torsten
Knorkator
Knorkator 12.06.2014 aktualisiert um 12:34:13 Uhr
Goto Top
Hilft Dir das Erstellungsdatum der Dateien vielleicht auch weiter?

Schau mal hier:
http://blog.waltritscher.com/index.php/2009/08/30/powershell-find-files ...

Poste doch zusätzlich bitte einen Originalen Dateinamen sowie einen von einer Dublette.
Evtl. sollte man nicht die ersten 16 Zeichen filtern sondern die letzten.
colinardo
Lösung colinardo 12.06.2014 aktualisiert um 15:30:48 Uhr
Goto Top
Hi Thorsten,
wenn Powershell nichts ausmacht, probiers mal hiermit:
$folder = "C:\test"  
$files = dir $folder -Recurse |  ?{!$PSIsContainer -and $_.BaseName.Length -ge 16}
$dupes = @()
foreach($file in $files){
    $check = dir "$($file.Directory)\$($file.BaseName.Substring(0,16))*" -ErrorAction SilentlyContinue | sort -Property LastWriteTime  
    if ($check.Count -gt 1){
        foreach($f in $check[1..($check.Length)]){
            if ($dupes -notcontains $f.FullName){
                $dupes += $f.FullName
            }
        }
    }
}
$dupes | %{write-host "Lösche Dublette: '$_'" -ForegroundColor Green; remove-item $_ -Force}  
Bitte bei dir an einem Testordner vorher testen.

Grüße Uwe
Tommy70
Tommy70 12.06.2014 um 13:11:44 Uhr
Goto Top
Hallo,

dafür gibt es auch schon fertige Freeware Tools wie zum Beispiel DoubleKiller

Tom
goodbytes
goodbytes 12.06.2014 um 15:59:38 Uhr
Goto Top
Hallo Uwe,
funktioniert perfekt, vielen Dank !!! face-smile

@Tommy70
Vielen Dank aber das Toll bringt mich da leider nicht weiter. Es handelt sich im Ergebnis um knapp 200 übrig gebliebene Dateien, aus denen sind durch den Fehler rund 15.000 Dateien entstanden. Ich hätte somit knapp 200 Filter "DieErsten16Stellen*" anlegen müssen... face-sad

Also, vielen Dank an Alle !!! face-smile

Gruß
Torsten