From 37b713f83bdc99d8a0492a21f88f245d9f33e773 Mon Sep 17 00:00:00 2001 From: Martin Rattensberger Date: Mon, 14 Oct 2024 09:05:53 +0200 Subject: [PATCH] getestete Version mit Duplikatenfindung und Sortierung --- bilder_und_videos_sortieren.ps1 | 83 +++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 34 deletions(-) diff --git a/bilder_und_videos_sortieren.ps1 b/bilder_und_videos_sortieren.ps1 index 1c3c2b6..cefb369 100644 --- a/bilder_und_videos_sortieren.ps1 +++ b/bilder_und_videos_sortieren.ps1 @@ -1,53 +1,68 @@ # Ordnerpfad angeben $sourceFolder = Read-Host -Prompt "Bitte geben Sie den Pfad des Quellordners an" -$duplicatesFolder = Join-Path -Path $sourceFolder -ChildPath "Duplikate" -# Überprüfen, ob der Quellordner existiert -if (-Not (Test-Path -Path $sourceFolder)) { - Write-Host "Der angegebene Ordner existiert nicht." -ForegroundColor Red - exit +# Ordnerpfade für Bilder, Videos und Duplikate angeben +$imagesFolder = Join-Path -Path $sourceFolder -ChildPath "Bilder" +$videosFolder = Join-Path -Path $sourceFolder -ChildPath "Videos" +$duplicatesImagesFolder = Join-Path -Path $imagesFolder -ChildPath "Duplikate" +$duplicatesVideosFolder = Join-Path -Path $videosFolder -ChildPath "Duplikate" + +# Überprüfen, ob die Quellordner existieren, andernfalls erstellen +foreach ($folder in @($imagesFolder, $videosFolder, $duplicatesImagesFolder, $duplicatesVideosFolder)) { + if (-Not (Test-Path -Path $folder)) { + New-Item -Path $folder -ItemType Directory | Out-Null + } } -# Überprüfen, ob der Duplikate-Ordner existiert, andernfalls erstellen -if (-Not (Test-Path -Path $duplicatesFolder)) { - New-Item -Path $duplicatesFolder -ItemType Directory | Out-Null -} +# Alle Bild- und Videodateien im Ordner abrufen +$files = Get-ChildItem -Path $sourceFolder -Recurse -File | Where-Object { $_.Extension -in '.jpg', '.jpeg', '.png', '.gif', '.bmp', '.mp4', '.mov', '.avi', '.mkv' } -# Alle Bilddateien im Ordner abrufen -$images = Get-ChildItem -Path $sourceFolder -File -Include *.jpg, *.jpeg, *.png, *.gif, *.bmp +# Hashtable zum Speichern von Hashes der Dateien +$hashTableImages = @{} +$hashTableVideos = @{} -# Hashtable zum Speichern von Hashes der Bilder -$hashTable = @{} - -foreach ($image in $images) { - # Erstelldatum des Bildes abrufen - $creationDate = (Get-Item $image.FullName).CreationTime +foreach ($file in $files) { + # Früheres Datum zwischen Erstelldatum und Änderungsdatum abrufen + $creationDate = (Get-Item $file.FullName).CreationTime + $lastWriteDate = (Get-Item $file.FullName).LastWriteTime + $dateToUse = if ($creationDate -lt $lastWriteDate) { $creationDate } else { $lastWriteDate } - # Jahr und Monat aus dem Erstelldatum extrahieren - $year = $creationDate.ToString('yyyy') - $month = $creationDate.ToString('MM') + # Jahr und Monat aus dem zu verwendenden Datum extrahieren + $year = $dateToUse.ToString('yyyy') + $month = $dateToUse.ToString('MM') + + # Zielunterordner nach Jahr und Monat erstellen, abhängig vom Dateityp + if ($file.Extension -in '.jpg', '.jpeg', '.png', '.gif', '.bmp') { + $targetFolder = Join-Path -Path $imagesFolder -ChildPath "$year\$month" + $hashTable = $hashTableImages + $duplicatesFolder = $duplicatesImagesFolder + } elseif ($file.Extension -in '.mp4', '.mov', '.avi', '.mkv') { + $targetFolder = Join-Path -Path $videosFolder -ChildPath "$year\$month" + $hashTable = $hashTableVideos + $duplicatesFolder = $duplicatesVideosFolder + } else { + continue + } - # Zielunterordner nach Jahr und Monat erstellen - $targetFolder = Join-Path -Path $sourceFolder -ChildPath "$year\$month" if (-Not (Test-Path -Path $targetFolder)) { New-Item -Path $targetFolder -ItemType Directory | Out-Null } - # Bild-Hash berechnen, um Duplikate zu identifizieren - $hash = (Get-FileHash -Path $image.FullName -Algorithm MD5).Hash + # Datei-Hash berechnen, um Duplikate zu identifizieren + $hash = (Get-FileHash -Path $file.FullName -Algorithm MD5).Hash if ($hashTable.ContainsKey($hash)) { - # Bild ist ein Duplikat, in den Duplikate-Ordner verschieben - $duplicateDestination = Join-Path -Path $duplicatesFolder -ChildPath $image.Name - Move-Item -Path $image.FullName -Destination $duplicateDestination - Write-Host "Duplikat '$($image.Name)' wurde nach '$duplicatesFolder' verschoben." -ForegroundColor Yellow + # Datei ist ein Duplikat, in den entsprechenden Duplikate-Ordner verschieben + $duplicateDestination = Join-Path -Path $duplicatesFolder -ChildPath $file.Name + Move-Item -Path $file.FullName -Destination $duplicateDestination + Write-Host "Duplikat '$($file.Name)' wurde nach '$duplicatesFolder' verschoben." -ForegroundColor Yellow } else { - # Bild ist kein Duplikat, in den Zielordner verschieben - $hashTable[$hash] = $image.FullName - $destinationPath = Join-Path -Path $targetFolder -ChildPath $image.Name - Move-Item -Path $image.FullName -Destination $destinationPath - Write-Host "Bild '$($image.Name)' wurde nach '$targetFolder' verschoben." -ForegroundColor Green + # Datei ist kein Duplikat, in den Zielordner verschieben + $hashTable[$hash] = $file.FullName + $destinationPath = Join-Path -Path $targetFolder -ChildPath $file.Name + Move-Item -Path $file.FullName -Destination $destinationPath + Write-Host "Datei '$($file.Name)' wurde nach '$targetFolder' verschoben." -ForegroundColor Green } } -Write-Host "Alle Bilder wurden erfolgreich in entsprechende Unterordner verschoben. Duplikate wurden in den Ordner 'Duplikate' verschoben." -ForegroundColor Cyan \ No newline at end of file +Write-Host "Alle Dateien wurden erfolgreich in entsprechende Unterordner verschoben. Duplikate wurden in die entsprechenden Duplikate-Ordner verschoben." -ForegroundColor Cyan \ No newline at end of file