Assumindo que você pode usar o Windows como um SO para todo o processo e não gosta de Free Duplicate File Finder (nunca tentei, mas achei mencionado aqui ), você pode usar o PowerShell para obter o que deseja com relativamente pouco esforço. Nota: Eu não sou um profissional de verdade no PowerShell, então tenho certeza que alguém poderia refinar meu código.
Basta abrir o Powershell ISE (ou, se você não tiver isso, usar o Notepad), copiar e colar o seguinte código nele e salvar o arquivo resultante em algum lugar como * .ps1.
Você também precisa alterar os valores de $oldpath
e $newpath
para seus diretórios - basta colocar seus caminhos entre aspas.
# 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++
}
}
Em seguida, inicie o script (por meio do clique com o botão direito do mouse, por exemplo) - se isso falhar, verifique se o ExecutionPolicy
está definido ( link ).
Eu uso um script quase idêntico para verificar arquivos que já foram copiados (mas possivelmente com nomes alterados). Este código pressupõe que apenas os nomes dos arquivos são diferentes, mas não o conteúdo. A última hora de edição geralmente permanece a mesma, mesmo depois de copiar um arquivo para um novo caminho - ao contrário do tempo de criação. Se o conteúdo for diferente, minha solução falha muito - você pode usar diferentes atributos exclusivos de arquivos (mas quais?) Ou declarar, por exemplo, somente os arquivos tat são menores ou mais antigos (considerando o tempo de edição, novamente) do que os novos arquivos devem ser excluídos.
O que o script faz:
- Obtenção de todos os arquivos nas pastas especificadas (e suas subpastas)
- obtendo o primeiro arquivo antigo (especificado por $ i) ...
- comparando seu tempo de última edição e seu tamanho de arquivo com o do primeiro novo arquivo (especificado por $ j) ...
- ... se eles forem iguais, calcula um hash de arquivo para ter certeza de que é definitivamente o mesmo arquivo (sem dúvida, isso pode ser um pouco demais muito esforço para o seu objetivo)
- se os hashes forem iguais, o arquivo antigo será excluído (e gravará qual arquivo no terminal) e, em seguida, será iniciado novamente em 2. com o próximo arquivo antigo ...
- se os hashes não forem iguais (ou as últimas edições não forem iguais ou os tamanhos dos arquivos não forem iguais), ele será iniciado novamente em 3. com o próximo arquivo novo.