Gleichnamige Dateien in anderem Ordner löschen unter Windows 10

Stefan mit F

Ensign
Registriert
Dez. 2013
Beiträge
135
Moin,

falls diese Frage in einem anderen Unterforum besser aufgehoben ist, kann der Thread gerne verschoben werden.

Zur Frage: Ich habe 2 Ordner: Im ersten Ordner befinden sich folgende Dateien:
Bild1.jpg
Bild2.jpg
Bild3.jpg
Bild4.jpg
Bild5.jpg
usw.

Im zweiten Ordner befinden sich folgende Dateien:
Bild1.nef
Bild2.nef
Bild3.nef
Bild4.nef
Bild5.nef
usw.

Nun betrachte ich die Bilder im ersten Ordner mit der der Windows-Fotoanzeige und lösche einige Bilder. Anschließend enthält der erste Ordner nur noch folgende Dateien:
Bild2.jpg
Bild3.jpg
Bild5.jpg
usw.

Nun möchte ich Bild1.nef und Bild4.nef aus dem zweiten Ordner automatisch entfernen lassen.

Grund für diese Vorgehensweise: Die .nef-Dateien sind zur Schnellansicht ungeeignet. Sie im Schnelldurchlauf durchzusehen, um überflüssige Bilder zu löschen, dauert zu lange. Daher nehme ich das Aussortieren im .jpg-Ordner vor.
Allerdings möchte ich nach dem Aussortieren die Rohaufnahmen (im .nef-Ordner) verwenden.

Ich besitze über 50.000 Bilder jeweils in Ordnern mit meistens zwischen 100 und 3000 Dateien pro Ordner, wobei der erste Ordner immer JPG und der zweite Ordner immer NEF heißt und beide Ordner zusammen in einem Ordner mit individuellem Namen (Beispiel: Ereignis xy) liegen.

Es kommen monatlich ein paar hundert bis ein paar tausend Bilder dazu und es ist extrem zeitaufwändig, immer in beiden Ordnern synchron zu löschen.

Hat jemand eine Idee, wie ich das optimieren kann?
Gibt es eine Möglichkeit zu sagen:
"Lösche alle Dateien im zweiten Ordner, deren Dateiname ABC.nef nicht als ABC.jpg im ersten Ordner vertreten ist."?

Vielen Dank im voraus und viele Grüße
Stefan
 
Ich würde das ganze mit der PowerShell lösen. Hier ein kurzes Skript - bitte vorher aber ausgiebig testen:
PowerShell:
# Pfade müssen definiert werden
$jpg = "D:\ps\jpg"
$nef = "D:\ps\nef"

# Dateien werden eingelesen
$jpgfiles = Get-ChildItem -Path $jpg
$neffiles = Get-ChildItem -Path $nef

# Prüfung ob der Name der NEF-Datei in den JPG-Dateien vorhanden ist und ggf. wird die Datei gelöscht
foreach ( $neffile in $neffiles){
        if ( $jpgfiles.BaseName -ccontains $neffile.BaseName ){
            Write-Host $neffile.BaseName " vorhanden"
        }
        else {
            Remove-Item "$nef\$neffile" -force
            Write-Host $neffile.BaseName " wurde gelöscht"
        }
}

Hier eine Beispiel Ausgabe (Bild2.nef würde dann auch gelöscht werden):
Code:
Bild1  vorhanden
Bild2  wurde gelöscht
Bild3  vorhanden
Bild4  vorhanden

Nachtrag:
Bitte wirklich ausgiebig testen, da dieses Skript Dateilöschaktionen durchführt. Ich habe es nur "quick and dirty" runter geschrieben und in nem Testordner kurz auf Funktion getestet. Jegliche Verantwortung liegt beim Verwender :-D
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Stefan mit F und Terrier
Moin,

vielen, vielen Dank! :)
Das ist genau das, was ich gesucht habe! Dass es mit der PowerShell geht, war mir schon klar (dazu hatte mir im persönlichen Gespräch schon mal jemand geraten), aber mir fehlte bisher die Ambition, mich da auf gut Glück einzuarbeiten, vor allem mit der Sorge, etwas kaputt zu machen.
Da ist so ein quasi fertiger Code schon was feines.

Ich habe einen bestehenden Ordner mit entsprechenden Unterordnern auf eine leere Platte kopiert und es da ausprobiert und es macht genau, was es soll. Klasse! :daumen:

Das ist für mich eine super Grundlage, mich noch weiter in die PowerShell einzuarbeiten.

Eine Frage hätte ich noch: Was muss ich tun, um die Datei in einen Ordner "Waste" zu verschieben, statt sie zu löschen?

Danke Danke Danke!
Sag mal Bescheid wenn Du mal in Hagen / NRW bist, dann gebe ich dir ein Bier o.ä. aus. :schluck:
 
Kurz umgebaut:
PowerShell:
# Pfade müssen definiert werden
$jpg = "D:\ps\jpg"
$nef = "D:\ps\nef"
$target = "D:\ps\waste"

# Dateien werden eingelesen
$jpgfiles = Get-ChildItem -Path $jpg
$neffiles = Get-ChildItem -Path $nef

# Prüfung ob der Name der NEF-Datei in den JPG-Dateien vorhanden ist und ggf. wird die Datei verschoben
foreach ( $neffile in $neffiles){
        if ( $jpgfiles.BaseName -ccontains $neffile.BaseName ){
            Write-Host $neffile.BaseName " vorhanden"
        }
        else {
            Move-Item -Path "$nef\$neffile" -Destination "$target\$neffile" -force
            Write-Host $neffile.BaseName "wurde verschoben"
        }
}

NRW ist leider nicht ganz meine Ecke, aber freut mich wenn‘s passt.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Stefan mit F
Klasse! Danke!
Läuft auch einwandfrei. Und damit habe ich nochmal eine quantitative Kontrolle und kann danach (und ggf. nach Sichtung) entscheiden, die aussortierten .NEF-Dateien tatsächlich zu löschen.

Ein einziger "Fehler" ist mir aufgefallen: Der Kommentar in Zeile 10 im neuen Code ist nicht mehr richtig. Da müsste statt "gelöscht" das Wort "verschoben" stehen. ;) Aber bei dem Tempo, in dem die Antworten auf meine Fragen entstanden sind, ist das verständlich.

Nochmals vielen, vielen Dank!! :daumen: :daumen:
 
Kommentar angepasst ;-)

Viel Spaß mit dem Skript und beim PowerShell lernen (an der führt im Windows-Umfeld nichts mehr vorbei)
 
  • Gefällt mir
Reaktionen: Stefan mit F
Zurück
Oben