Предполагая, что вы можете использовать Windows в качестве ОС для всего процесса и вам не нравится Free Duplicate File Finder (никогда не пробовал, но нашел его здесь упомянутым ), вы можете использовать PowerShell для достижения того, чего вы хотите, с относительно небольшими усилиями. Примечание: я не настоящий профессионал в PowerShell, поэтому я почти уверен, что можно улучшить мой код.
Просто откройте Powershell ISE (или, если у вас его нет, используйте Блокнот), скопируйте и вставьте в него следующий код и сохраните полученный файл где-нибудь как * .ps1. Вы также должны изменить значения $oldpath
's' и $newpath
'' '' в ваших каталогах - просто поместите ваши пути между кавычками.
# 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++ } }
Затем запустите скрипт (например, с помощью щелчка правой кнопкой мыши) - если это не удастся, убедитесь, что ExecutionPolicy
он установлен ( https://superuser.com/a/106363/703240 ).
Я использую практически идентичный скрипт для проверки файлов, которые уже были скопированы (но, возможно, с измененными именами). Этот код предполагает, что отличаются только имена файлов, но не их содержимое. Время последнего редактирования обычно остается неизменным даже после копирования файла по новому пути - в отличие от времени создания. Если содержимое отличается, моё решение терпит неудачу - вы можете использовать разные уникальные атрибуты файлов (но какие?) Или указать, что, например, только те файлы, которые меньше или старше (учитывая время редактирования, опять же), чем новые файлы, должны быть удален.
Что делает скрипт:
- Получение всех файлов в указанных папках (и их подпапках)
- получить первый старый файл (указанный $ i) ...
- сравнивая время последнего редактирования и размер файла с размером первого нового файла (заданного $ j) ...
- ... если они равны, он вычисляет хэш файла, чтобы убедиться, что это определенно тот же файл (возможно, это может быть слишком много усилий для вашей цели)
- если хэши равны, старый файл удаляется (и он записывает, какой файл в терминале), а затем снова начинается с 2. со следующим старым файлом ...
- если хэши не равны (или времена последнего редактирования не равны, или размеры файлов не равны), он начинается снова с 3. со следующим новым файлом.