Angenommen, Sie können Windows als Betriebssystem für den gesamten Prozess verwenden und den Free Duplicate File Finder nicht mögen (habe es nie versucht, aber es wurde hier erwähnt ), könnten Sie PowerShell verwenden, um mit relativ wenig Aufwand zu erreichen, was Sie möchten. Hinweis: Ich bin kein echter Profi bei PowerShell, daher bin ich ziemlich sicher, dass man meinen Code verfeinern kann.
Öffnen Sie einfach Powershell ISE (oder verwenden Sie Notepad, wenn Sie diesen nicht haben), kopieren Sie den folgenden Code, fügen Sie ihn ein und speichern Sie die resultierende Datei als * .ps1. Sie müssen auch ändern $oldpath
‚s und $newpath
‘ s - Werte auf Ihre Verzeichnisse - einfach Ihre Wege zwischen den Anführungszeichen.
# Search-and-Destroy-script # Get all files of both code-directories: $oldpath = "Disk1:\code" $newpath = "DiskNew:\code" $files_old = Get-ChildItem -Path $oldpath -Recurse -File $files_new = Get-ChildItem -Path $newpath -Recurse -File for($i=0; $i -lt $files_old.length; $i++){ $j=0 while($true){ # if last edit time is the same and file-size is the same... if($($files_old[$i]).length -eq $($files_new[$j]).length -and $($files_old[$i]).lastWriteTime -eq $($files_new[$j]).lastWriteTime){ # Get File-Hashes for those files (SHA1 should be enough) $files_old_hash = Get-FileHash -Path $($files_old[$i]).FullName -Algorithm SHA1 | ForEach-Object {$_.Hash} $files_new_hash = Get-FileHash -Path $($files_new[$j]).FullName -Algorithm SHA1 | ForEach-Object {$_.Hash} # if hashes also are the same... if($files_old_hash -eq $files_new_hash){ # remove the old file (-Confirm can be removed so you don't have to approve for every file) # if you want to check the files before deletion, you could also just rename them (here we're adding the suffix ".DUPLICATE" # Rename-Item -Path $($files_old[$i]).FullName -NewName "$($files_old[$i]).Name.DUPLICATE" Remove-Item -Path $($files_old[$i]).FullName -Confirm Write-Host "DELETING`t$($files_old[$i]).FullName" -ForegroundColor Red break } # if files aren't the same... }else{ # if old_file is compared to all new_files, check next old file if($j -ge $files_new.length){ break } } $j++ } }
Starten Sie dann das Skript (z. B. mit der rechten Maustaste). Wenn dies fehlschlägt, stellen Sie sicher, dass Sie ExecutionPolicy
festgelegt sind ( https://superuser.com/a/106363/703240 ).
Ich verwende ein fast identisches Skript, um nach bereits kopierten Dateien zu suchen (möglicherweise jedoch mit geänderten Namen). Dieser Code setzt voraus, dass nur die Namen der Dateien unterschiedlich sind, nicht jedoch der Inhalt. Die letzte Bearbeitungszeit bleibt normalerweise gleich, selbst wenn Sie eine Datei in einen neuen Pfad kopieren - anders als die Erstellungszeit. Wenn der Inhalt anders ist, schlägt meine Lösung fehl. Sie können andere eindeutige Attribute von Dateien verwenden (aber welche?) Oder angeben, dass z. B. nur Dateien kleiner oder älter sind (was wiederum die Bearbeitungszeit betrifft) als die neuen Dateien gelöscht
Was macht das Skript:
- Abrufen aller Dateien in den angegebenen Ordnern (und ihren Unterordnern)
- Erste alte Datei abrufen (durch $ i angegeben) ...
- Vergleich der letzten Bearbeitungszeit und der Dateigröße mit der der ersten neuen Datei (durch $ j angegeben) ...
- Wenn sie gleich sind, berechnet sie einen Datei-Hash, um sicher zu gehen, dass es sich definitiv um dieselbe Datei handelt (dies könnte ein zu hoher Aufwand für Ihr Ziel sein).
- Wenn die Hashwerte gleich sind, wird die alte Datei gelöscht (und es wird geschrieben, welche Datei in das Terminal geschrieben wird). Anschließend wird wieder bei 2. mit der nächsten alten Datei begonnen.
- Wenn die Hashwerte nicht gleich sind (oder die letzten Bearbeitungszeiten nicht gleich sind oder die Dateigrößen nicht gleich sind), beginnen sie wieder bei 3. mit der nächsten neuen Datei.