¿Cómo encontrar archivos duplicados usando PowerShell?

Para uno de los proyectos, necesitaba un script de PowerShell para encontrar archivos duplicados en la carpeta de red compartida de un servidor de archivos. Hay una serie de herramientas de terceros para encontrar y eliminar archivos duplicados en Windows, pero la mayoría de ellas son comerciales o no son adecuadas para escenarios automáticos.

Debido a que los archivos pueden tener nombres diferentes pero contenido idéntico, no debe comparar archivos solo por el nombre. Es mejor obtener hashes de todos los archivos y encontrar los mismos entre ellos.

El siguiente comando de una sola línea de PowerShell le permite escanear recursivamente una carpeta (incluidas sus subcarpetas) y encontrar archivos duplicados. En este ejemplo, se encontraron dos archivos idénticos con los mismos valores hash:

Get-ChildItem –path C:Share -Recurse | Get-FileHash | Group-Object -property hash | Where-Object { $_.count -gt 1 } | ForEach-Object { $_.group | Select-Object Path, Hash }

Encontrar archivos duplicados con PowerShell

Este PowerShell one-liner es fácil de usar para encontrar duplicados, sin embargo, su rendimiento es bastante pobre. Si hay muchos archivos en la carpeta, llevará mucho tiempo calcular sus valores hash. Es más fácil comparar primero los archivos por su tamaño (es un atributo de archivo listo que no necesita calcularse). Luego obtendremos hashes de los archivos con el mismo tamaño solamente:

$file_dublicates = Get-ChildItem –path C:Share -Recurse| Group-Object -property Length| Where-Object { $_.count -gt 1 }| Select-Object –Expand Group| Get-FileHash | Group-Object -property hash | Where-Object { $_.count -gt 1 }| ForEach-Object { $_.group | Select-Object Path, Hash }

Puede comparar el rendimiento de ambos comandos en una carpeta de prueba usando el Cmdlet de comando de medida:

Measure-Command {your_powershell_command}

Para una carpeta que contiene 2000 archivos, el segundo comando es mucho más rápido que el primero (10 minutos frente a 3 segundos).

Puede pedirle a un usuario que seleccione archivos duplicados para eliminarlos. Para hacerlo, canalice una lista de archivos duplicados al cmdlet Out-GridView:

$file_dublicates | Out-GridView -Title "Select files to delete" -OutputMode Multiple –PassThru|Remove-Item –Verbose –WhatIf

script de powershell para encontrar archivos duplicados en Windows

Un usuario puede seleccionar archivos para eliminar en la tabla (para seleccionar varios archivos, mantenga presionado CONTROL) y haga clic en Aceptar.

En lugar de eliminarlos, puede mover los archivos seleccionados a otro directorio usando Mover elemento.

Además, puede reemplazar archivos duplicados con enlaces duros. El enfoque permite mantener los archivos en su lugar y ahorra significativamente espacio en disco.

param(
[Parameter(Mandatory=$True)]
[ValidateScript({Test-Path -Path $_ -PathType Container})]
[string]$dir1,
[Parameter(Mandatory=$True)]
[ValidateScript({(Test-Path -Path $_ -PathType Container) -and $_ -ne $dir1})]
[string]$dir2
)
Get-ChildItem -Recurse $dir1, $dir2 |
Group-Object Length | Where-Object {$_.Count -ge 2} |
Select-Object -Expand Group | Get-FileHash |
Group-Object hash | Where-Object {$_.Count -ge 2} |
Foreach-Object {
$f1 = $_.Group[0].Path
Remove-Item $f1
New-Item -ItemType HardLink -Path $f1 -Target $_.Group[1].Path | Out-Null
#fsutil hardlink create $f1 $_.Group[1].Path
}

Para ejecutar el archivo, use el siguiente formato del comando:

.hardlinks.ps1 -dir1 d:folder1 -dir2 d:folder2

El script se puede utilizar para buscar y reemplazar duplicados de archivos estáticos (eso no cambia!) con enlaces duros simbólicos.

En Windows Server, puede utilizar la función de deduplicación de datos integrada de la función de servidor de archivos para resolver el problema de la duplicación de archivos. Sin embargo, al usar la deduplicación y la copia de seguridad incremental, tendrá algunos problemas al restaurar desde la copia de seguridad.

Además, puedes usar una consola. dupemerge herramienta para reemplazar archivos duplicados con enlaces duros.

Artículos Interesantes