Duplikate löschen mit gleicher Name unterschiedlicher Endungen

Nutzer01

Newbie
Registriert
Jan. 2021
Beiträge
2
Hallo,

ich habe meine defekte Festplatte mit einer Recovery Software gerettet. Sie hat mir leider fast zu jeder Datei mehrere Duplikate ausgespuckt. Zwar habe ich versucht händisch alle zu entfernen, aber es dauert einfach zu lange. Bin deshalb seit Tagen auf der Suche nach einem Skript der mir das Leben erleichtern kann, leider ohne Erfolg.

Zu den Dateinamen werden "*_0" ; "*_1" ; "*_2" .. "*_17" .. usw. hinzugefügt, so sind die Duplikate benannt (siehe Anhang für ein Bsp).

Ich würde ja gerne alle, die mit "*_Zahl" enden, löschen, aber manchmal funktioniert die "originale" Datei nicht und deshalb brauche ich eben öfters eines der Duplikate.

Deshalb habe ich mir folgendes ausgedacht:

1. händisch alle nicht funktionierende Dateien löschen. Ich glaube da führt kein Weg vorbei (dauert zwar bisschen aber zum Glück muss ich nicht einzeln draufklicken, ich sehe mit der passenden Ansicht im Ordner ob eine Datei funktioniert oder beschädigt ist.)
1. Sortieren nach Name
2. Entferne die aktuelle Datei wenn die vorherige Datei eine "_Zahl" am Ende hat und diese Zahl kleiner ist als die Zahl von der aktuellen Datei.

Ich hoffe dass mir jemand weiterhelfen kann. Leider wollte/konnte die Firma von dieser Software nicht weiterhelfen (hat sogar ziemlich teuer gekostet!)

Vielen Dank im Voraus!
 

Anhänge

  • bsp.JPG
    bsp.JPG
    12,5 KB · Aufrufe: 207
Nutzer01 schrieb:
1. händisch alle nicht funktionierende Dateien löschen. Ich glaube da führt kein Weg vorbei (dauert zwar bisschen aber zum Glück muss ich nicht einzeln draufklicken, ich sehe mit der passenden Ansicht im Ordner ob eine Datei funktioniert oder beschädigt ist.)
Geht vmtl auch. Gibt bei vielen Programmen testmodi die einfach schauen, ob die gegebene Datei defekt ist oder nicht. Somit kannst du schonmal alle sicher defekten aussortieren. Evtl. bleiben aber False negatives, da musst du durch.

0. Leg eine Kopie aller wiederhergestellten daten an.

1. Lösche wie oben beschrieben kaputte dateien

2. Nehmen wir an du bist soweit alle doubles zu löschen.
Dann leg ein weiteres backup an.

Dann schau dir RegEx an, vmtl. im Zusammenhang mit Python. Ein bischen scripten sollte heute vmtl. jeder können und die 5 Stunden um es zu lernen sind ein günstiger Preis wenn du offensichtlich kein backup hast und davon auch noch etwas lernst.
Du solltest einen String wie etwa den folgenden nehmen:
Python:
\w+_\d+
\w+ steht für einen beliebigen Buchstaben, + bedeutet einer oder mehrere. \d+ steht für eine oder mehrere Ziffern. Dann kannst du rumspielen. Ein Ansatz der mir spontan einfällt wäre folgender.
Wenn du mit obigem string eine Datei gematcht hast schaue, ob du eine identische Datei ohne das _Zahl anhängsel hast. Wenn ja lösche deine aktuelle Datei. Wenn nein, entferne _Zahl aus dem aktuellen Dateinahmen.

Zuletzt noch eine Warnung. Ich denke du nutzt Windows und hast eingestellt, dass es Dateiendungen ausblendest? Der Typ der die Funktion hinzugefügt hat gehört ... sagen wir mal freundlich ... gefeuert (.pdf.exe). Geh bitte mal ganz sicher (Dateiendungen einblenden), dass die Dateien wirklich so heißen, RegEx ist eine gefährliche Sache.

Noch eine letzte Anmerkung. Du hast dich wohl nicht um ein backup gekümmert, dh. werde ich meine Zeit nicht investieren um deine Fehler auszubügeln. Wie du ein Backup (3-2-1) richtig machst lernst du in einem anderen unterforum hier. Aber falls du bereit bist dich selbst um die Wiederherstellung zu kümmern, hier ein Beispiel für ein sehr simples skript mit welchem ich eine Filmsammlung aufgeräumt habe.


Python:
import os
import re
import itertools
basedir = "/mnt/8TB/Movies/Filme_A_C"
os.chdir(basedir)
film_list = os.listdir()
for film in film_list:

    if not ".mpg" in film:
        print("skipped", film)
        continue

    endung = ".mpg" + film.split(".mpg",1)[1]
    name = film.split(".mpg",1)[0]
    if not any(char.isdigit() for char in name):
        print("nothing to do", name)
        continue
    new_name = "".join(itertools.takewhile((lambda x: not x.isdigit()), name))
    new_name = new_name[:-1]
    full_new_name = new_name+endung
    if not os.path.isfile(full_new_name):
        old_path = os.path.join(basedir, film)
        new_path = os.path.join(basedir, full_new_name)
        os.rename(old_path, new_path)
        print(old_path, new_path)
        continue
    print("name showed up multiple times: ", full_new_name)
    new_name += "_v"
    version = 2
    while os.path.isfile(os.path.join(basedir, new_name+str(version)+endung)):
            version += 1
    full_new_name = new_name+str(version)+endung
    old_path = os.path.join(basedir, film)
    new_path = os.path.join(basedir, full_new_name)
    os.rename(old_path, new_path)
    print(old_path, new_path)

Das passt natürlich nicht direkt zu deinem Problem und auch kein kunstwerk von mir, aber es kann dir als Grundlage dienen. Falls du genauere Fragen hast kannst du dich gerne melden.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Nutzer01
vielen Dank für die schnelle Antwort und danke für die Vorschläge!

EDIT: ich denke ich habs endlich raus. :)
1. Ich nehme alle Duplikate die ich tatsächlich brauche raus aus dem Ordner und speichere sie wo anders ab. 2. Löschen aller Duplikate mit Powershell. Code:
Get-Childitem -path C:\PFAD -Filter *.txt -Recurse | where-object {$_.Name -ilike "*_1.txt"} | Remove-Item -Force -WhatIf

Habe zwar nicht nur textdateien, trotzdem wird es um einiges schneller :) Danke Euch!
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: DerTiger
Zurück
Oben