getestete Version mit Duplikatenfindung und Sortierung

This commit is contained in:
2024-10-14 09:05:53 +02:00
parent 3b5d0435bc
commit 37b713f83b

View File

@@ -1,53 +1,68 @@
# Ordnerpfad angeben # Ordnerpfad angeben
$sourceFolder = Read-Host -Prompt "Bitte geben Sie den Pfad des Quellordners an" $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 # Ordnerpfade für Bilder, Videos und Duplikate angeben
if (-Not (Test-Path -Path $sourceFolder)) { $imagesFolder = Join-Path -Path $sourceFolder -ChildPath "Bilder"
Write-Host "Der angegebene Ordner existiert nicht." -ForegroundColor Red $videosFolder = Join-Path -Path $sourceFolder -ChildPath "Videos"
exit $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 # Alle Bild- und Videodateien im Ordner abrufen
if (-Not (Test-Path -Path $duplicatesFolder)) { $files = Get-ChildItem -Path $sourceFolder -Recurse -File | Where-Object { $_.Extension -in '.jpg', '.jpeg', '.png', '.gif', '.bmp', '.mp4', '.mov', '.avi', '.mkv' }
New-Item -Path $duplicatesFolder -ItemType Directory | Out-Null
}
# Alle Bilddateien im Ordner abrufen # Hashtable zum Speichern von Hashes der Dateien
$images = Get-ChildItem -Path $sourceFolder -File -Include *.jpg, *.jpeg, *.png, *.gif, *.bmp $hashTableImages = @{}
$hashTableVideos = @{}
# Hashtable zum Speichern von Hashes der Bilder foreach ($file in $files) {
$hashTable = @{} # 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 }
foreach ($image in $images) { # Jahr und Monat aus dem zu verwendenden Datum extrahieren
# Erstelldatum des Bildes abrufen $year = $dateToUse.ToString('yyyy')
$creationDate = (Get-Item $image.FullName).CreationTime $month = $dateToUse.ToString('MM')
# Jahr und Monat aus dem Erstelldatum extrahieren # Zielunterordner nach Jahr und Monat erstellen, abhängig vom Dateityp
$year = $creationDate.ToString('yyyy') if ($file.Extension -in '.jpg', '.jpeg', '.png', '.gif', '.bmp') {
$month = $creationDate.ToString('MM') $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)) { if (-Not (Test-Path -Path $targetFolder)) {
New-Item -Path $targetFolder -ItemType Directory | Out-Null New-Item -Path $targetFolder -ItemType Directory | Out-Null
} }
# Bild-Hash berechnen, um Duplikate zu identifizieren # Datei-Hash berechnen, um Duplikate zu identifizieren
$hash = (Get-FileHash -Path $image.FullName -Algorithm MD5).Hash $hash = (Get-FileHash -Path $file.FullName -Algorithm MD5).Hash
if ($hashTable.ContainsKey($hash)) { if ($hashTable.ContainsKey($hash)) {
# Bild ist ein Duplikat, in den Duplikate-Ordner verschieben # Datei ist ein Duplikat, in den entsprechenden Duplikate-Ordner verschieben
$duplicateDestination = Join-Path -Path $duplicatesFolder -ChildPath $image.Name $duplicateDestination = Join-Path -Path $duplicatesFolder -ChildPath $file.Name
Move-Item -Path $image.FullName -Destination $duplicateDestination Move-Item -Path $file.FullName -Destination $duplicateDestination
Write-Host "Duplikat '$($image.Name)' wurde nach '$duplicatesFolder' verschoben." -ForegroundColor Yellow Write-Host "Duplikat '$($file.Name)' wurde nach '$duplicatesFolder' verschoben." -ForegroundColor Yellow
} else { } else {
# Bild ist kein Duplikat, in den Zielordner verschieben # Datei ist kein Duplikat, in den Zielordner verschieben
$hashTable[$hash] = $image.FullName $hashTable[$hash] = $file.FullName
$destinationPath = Join-Path -Path $targetFolder -ChildPath $image.Name $destinationPath = Join-Path -Path $targetFolder -ChildPath $file.Name
Move-Item -Path $image.FullName -Destination $destinationPath Move-Item -Path $file.FullName -Destination $destinationPath
Write-Host "Bild '$($image.Name)' wurde nach '$targetFolder' verschoben." -ForegroundColor Green 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 Write-Host "Alle Dateien wurden erfolgreich in entsprechende Unterordner verschoben. Duplikate wurden in die entsprechenden Duplikate-Ordner verschoben." -ForegroundColor Cyan