W11 - Dateien kopieren, wenn nicht identisch umbenennen

x.treme

Captain
Registriert
Sep. 2008
Beiträge
3.244
Hi zusammen,

ich habe eine sehr historische Backup-Struktur der letzten 20 Jahre, e.g. meistens habe ich den kompletten Windows User-Folder gesichert, ohne jegliche Deduplication, womit da nun > 10 TB an Backups rumliegen ;)
Jetzt versuche ich da kurz und schmerzlos ein wenig Ordnung reinzubringen.

Dafür suche ich ein Tool, welches:
  • Dateien vergleicht ob sie identisch sind (entweder via Hash oder Datum + Size)
  • Wenn sie nicht identisch sind, automatisiert die Files umbenennt, e.g. eine (1) dahinter setzt
  • Best-Case: Die doppelten Dateien automatisch löscht

Mit Total Commander bekomme ich das nicht hin, Syncovery würde es können aber ist viel zu aufwendig für jedes Ordner-Paar einzurichten ... andere Lösung?
 
Geht das nicht damit? 🤔

Total Commander

1674726371421.png



Mit Total Commanders Mehrfach-Umbenenn-Tool können Sie mehrere Dateien einfach umbenennen: Gross-/Kleinschreibung verändern, Suchen und Ersetzen (mit RegEx-Unterstützung), Hinzufügen eines Zählers oder das Bearbeiten/Laden der Dateinamen mit einem Texteditor sind möglich. Sie können Dateien auch anhand ihrer Attribute umbenennen, z.B. Datum/Zeit, EXIF-Informationen oder Feldern aus ID3-Tags. Die Menge der verfügbaren Attribute kann mit einer vielzahl kostenloser Inhaltsplugins vergrößert werden

Edit: Ansonsten überlege ich gerade noch, ob es sich auch mit einem Powershell-Skript realisieren lässt.
 
Das würde schon gehen! (auch wenn ich mir gerade nicht sicher bin, ob Total Commander da nur den Namen prüft, oder ob sie wirklich identisch sind?)
Aber ich benötige es eher in Richtung Copy+C / Copy+V und dann passiert es automatisch und läuft durch, nach der einmal definierten Regel.

Wenn ich jedes mal warten muss bis die Liste generiert wurde, und dann bestätigen, dauert das halt ne Ewigkeit bei so vielen Ordnern ...
 
Hab die Frage mal an ChatGPT weitergeleiter. Das Ergebnis sieht wie folgt aus, via Powershell Skript:

Das folgende PowerShell-Skript vergleicht Dateien in zwei angegebenen Ordnern anhand ihres Hashes und benennt sie um, wenn sie nicht identisch sind. Wenn die Dateien identisch sind, wird ein Exemplar gelöscht:

Code:
$folder1 = "C:\example\folder1" # Replace with the path to the first folder you want to check
$folder2 = "C:\example\folder2" # Replace with the path to the second folder you want to check
$files1 = Get-ChildItem $folder1 -File
$files2 = Get-ChildItem $folder2 -File
$hashes = @{}

foreach ($file1 in $files1) {
    $hash1 = (Get-FileHash $file1.FullName).Hash
    $file2 = $files2 | Where-Object {$_.Name -eq $file1.Name}
    if ($file2 -ne $null) {
        $hash2 = (Get-FileHash $file2.FullName).Hash
        if ($hash1 -eq $hash2) {
            # If the files are identical, delete one of them
            Remove-Item $file2.FullName
        } else {
            # If the files are not identical, rename one of them
            $newName = $file2.FullName + "(1)"
            Rename-Item $file2.FullName $newName
        }
    }
}

Um die Dateien anstatt anhand des Hashes anhand des Datum und der Dateigröße zu vergleichen und die Dateien umzubenennen, können Sie dieses Skript verwenden:

Code:
$folder1 = "C:\example\folder1" # Replace with the path to the first folder you want to check
$folder2 = "C:\example\folder2" # Replace with the path to the second folder you want to check
$files1 = Get-ChildItem $folder1 -File
$files2 = Get-ChildItem $folder2 -File
$hash = @{}

foreach ($file1 in $files1) {
    $key1 = $file1.LastWriteTime + "-" + $file1.Length
    $file2 = $files2 | Where-Object {$_.Name -eq $file1.Name}
    if ($file2 -ne $null) {
        $key2 = $file2.LastWriteTime + "-" + $file2.Length
        if ($key1 -eq $key2) {
            # If the files are identical, delete one of them
            Remove-Item $file2.FullName
        } else {
            # If the files are not identical, rename one of them
            $newName = $file2.FullName + "(1)"
            Rename-Item $file2.FullName $newName
        }
    }
}

Habs jetzt nicht getestet, aber bei der Umbenennung müsste man wahrscheinlich noch ansetzen. So wie ich das sehe, würd er aus abc.docx ein abc.docx(1) machen.

Könnte dann so aussehen:

Code:
            # If the files are not identical, rename one of them
            $newName = $file2.BaseName + "(1)" + $file2.Extension
            $newPath = Join-Path $file2.DirectoryName $newName
            Rename-Item $file2.FullName $newPath

Es gibt mehrere Möglichkeiten, das oben genannte Skript für mehrere Ordner aufzurufen. Eine Möglichkeit besteht darin, den Pfad der Ordner in eine CSV-Datei zu schreiben und dann das Skript so anzupassen, dass es jede Zeile der CSV-Datei als Ordnerpfad verwendet.

Ein Beispiel für eine CSV-Datei könnte so aussehen:

Code:
C:\example\folder1,C:\example\folder2
C:\example\folder3,C:\example\folder4


Das Skript kann dann so angepasst werden, dass es die CSV-Datei einliest und jede Zeile als Ordnerpfad verwendet:

Code:
$csvFile = "C:\example\folders.csv" # Replace with the path to the CSV file
$folders = Import-Csv -Path $csvFile

foreach ($folderPair in $folders) {
    $folder1 = $folderPair.folder1
    $folder2 = $folderPair.folder2
    $files1 = Get-ChildItem $folder1 -File
    $files2 = Get-ChildItem $folder2 -File
    $hashes = @{}

    # rest of the script stays the same
    ...
}


Eine andere Möglichkeit besteht darin, das Skript als eine Schleife zu schreiben, die über eine Liste von Ordnern iteriert und das Skript für jeden Ordner aufruft. Eine weitere Möglichkeit wäre ein Skript mit einer Argumentenliste, welche die Ordner enthält und die Schleife durch die Argumentenliste iteriert und das Skript für jeden Ordner aufruft.

Wichtig ist, dass Sie sicherstellen, dass das Skript für jeden Ordner aufgerufen wird und dass es keine Überschneidungen mit bereits bearbeiteten Ordnern gibt, um sicherzustellen, dass die Dateien korrekt verarbeitet werden.
 
Zuletzt bearbeitet:
Zurück
Oben