Doppelte Dateien mit der Powershell suchen

Doppelte Dateien mit der Powershell suchen

Um zwei Ordner miteinander zu vergleichen und doppelte Dateien zu finden, kannst du das oben beschriebene PowerShell-Skript erweitern, sodass es die Dateien aus beiden Ordnern vergleicht. Dabei wird der Dateihash (z. B. MD5) verwendet, um den Inhalt der Dateien zu vergleichen.

Hier ist ein angepasstes PowerShell-Skript, das zwei Ordner miteinander vergleicht und doppelte Dateien basierend auf dem MD5-Hash identifiziert:

Doppelte Dateien mit der Powershell suchen

Doppelte Dateien mit der Powershell suchen

Hier ist ein PowerShell-Skript, das doppelte Dateien anhand des MD5-Hashes sucht:

Powershell-Skript anhand eines Hashes

# Ordner definieren, die verglichen werden sollen
$ordner1Pfad = “C:\Pfad\Zum\Ersten\Ordner”
$ordner2Pfad = “C:\Pfad\Zum\Zweiten\Ordner”

# Funktion zum Berechnen des MD5-Hashes einer Datei
function Get-FileHashMD5($filePath) {
$hashAlgorithm = [System.Security.Cryptography.MD5]::Create()
$fileStream = [System.IO.File]::OpenRead($filePath)
$hashBytes = $hashAlgorithm.ComputeHash($fileStream)
$fileStream.Close()

# Den Hash als lesbare Zeichenkette formatieren
return [BitConverter]::ToString($hashBytes) -replace “-“, “”
}

# Dateien und Hashes für beide Ordner sammeln
$hashTable = @{}
$duplikate = @()

# Dateien aus Ordner 1 einlesen und Hashes speichern
Get-ChildItem -Path $ordner1Pfad -Recurse -File | ForEach-Object {
$hash = Get-FileHashMD5 $_.FullName

if (-not $hashTable.ContainsKey($hash)) {
$hashTable[$hash] = $_.FullName
}
}

# Dateien aus Ordner 2 einlesen und mit den Hashes aus Ordner 1 vergleichen
Get-ChildItem -Path $ordner2Pfad -Recurse -File | ForEach-Object {
$hash = Get-FileHashMD5 $_.FullName

if ($hashTable.ContainsKey($hash)) {
# Wenn der Hash bereits in Ordner 1 gefunden wurde, ist es ein Duplikat
$duplikate += $_.FullName
Write-Host “Duplikat gefunden: $_.FullName (entspricht: $($hashTable[$hash]))”
}
}

# Ausgabe der doppelten Dateien
if ($duplikate.Count -gt 0) {
Write-Host “Gefundene doppelte Dateien:”
$duplikate | ForEach-Object { Write-Host $_ }
} else {
Write-Host “Keine doppelten Dateien zwischen den Ordnern gefunden.”
}

Powershell-Skript anhand der Größe

# Ordner definieren, die verglichen werden sollen
$ordner1Pfad = “N:\IONOS HiDrive\Mobile Uploads\samsung SM-S928B\2024-09\Camera”
$ordner2Pfad = “Y:\Mobile Uploads\samsung SM-S928B\2024-09\Camera”

# Hashtable für die Dateigrößen und Dateipfade des ersten Ordners erstellen
$sizeTable = @{}
$duplikate = @()

# Dateien aus dem ersten Ordner einlesen und die Größen speichern
Get-ChildItem -Path $ordner1Pfad -Recurse -File | ForEach-Object {
$fileSize = $_.Length # Dateigröße abrufen
if (-not $sizeTable.ContainsKey($fileSize)) {
$sizeTable[$fileSize] = @()
}
$sizeTable[$fileSize] += $_.FullName
}

# Dateien aus dem zweiten Ordner einlesen und mit den Größen aus dem ersten Ordner vergleichen
Get-ChildItem -Path $ordner2Pfad -Recurse -File | ForEach-Object {
$fileSize = $_.Length # Dateigröße abrufen
if ($sizeTable.ContainsKey($fileSize)) {
# Wenn die Dateigröße im ersten Ordner gefunden wurde, ist es ein Duplikat
foreach ($original in $sizeTable[$fileSize]) {
$duplikate += “Duplikat: $_.FullName entspricht $original”
}
}
}

# Ausgabe der doppelten Dateien
if ($duplikate.Count -gt 0) {
Write-Host “Gefundene doppelte Dateien (basierend auf der Dateigröße):”
$duplikate | ForEach-Object { Write-Host $_ }
} else {
Write-Host “Keine doppelten Dateien basierend auf der Größe zwischen den Ordnern gefunden.”
}

  • Erläuterung:

    • $ordner1Pfad und $ordner2Pfad: Hier gibst du die Pfade der beiden Ordner an, die du vergleichen möchtest.
    • Get-FileHashMD5: Diese Funktion berechnet den MD5-Hash für jede Datei, um ihren Inhalt zu vergleichen.
    • sizeTable: Eine Hashtable, die Dateigrößen als Schlüssel speichert und die Pfade der Dateien im ersten Ordner, die diese Größe haben, als Werte ablegt.
    • Die erste Get-ChildItem-Schleife liest alle Dateien aus dem ersten Ordner ein und speichert die MD5-Hashes in einer Hashtable.
    • Die zweite Get-ChildItem-Schleife liest alle Dateien aus dem zweiten Ordner ein und vergleicht deren MD5-Hashes mit den bereits gespeicherten Werten aus dem ersten Ordner. Wenn eine Übereinstimmung gefunden wird, wird die Datei als Duplikat markiert.
    • Write-Host: Gibt die gefundenen Duplikate und deren Entsprechung im ersten Ordner aus.

    Erweiterung:

    • Wenn du nur nach Dateinamen und Dateigröße vergleichen möchtest (ohne Hash-Berechnung), könntest du stattdessen die Eigenschaften Name und Length verwenden. Die Hash-Methode ist jedoch genauer, da sie den tatsächlichen Inhalt der Datei prüft.
    • Dieses Skript durchsucht beide Ordner rekursiv nach Dateien. Wenn du nur die oberste Ebene durchsuchen möchtest, entferne den Parameter -Recurse.

    Für große Dateien kann es etwas dauern, da jede Datei vollständig gelesen werden muss, um den Hash zu berechnen.