Всем доброго времени суток. Привожу перевод своей статьи с сайта Sysadmin's tricks.
Я не нашел простого и бесплатного решения с GUI, как найти одинаковые файлы на сетевой шаре, поэтому, решил написать скрипт на PowerShell.
Решил искать одинаковые файлы используя значение хеша MD5. Есть два способа получения хеша MD5 в PowerShell:
1. Нужно установить библиотеку Pscx и использовать командлет Get-Hash
2. Использовать вот такую функцию:
Далее полный листинг скрипта:
Объяснение:
Вычисляем MD5 хеш. Применяется ТОЛЬКО к файлам:
Получаем список файлов:
Исключая папки:
Перечисляем необходимые свойства, которые мы хотим видеть на выходе:
Name — имя файла
Fullname — путь к файлу
CreationTime — дата создания файла
LastWriteTime — дата последнего изменения файла
Length — размер, в байтах
Добавляем в свойства файла значение MD5 хеша:
Группируем файлы по MD5 хешу:
Находим повторения:
Сортируем файлы по MD5 хешу:
Экспортируем в .csv файл в формате Unicode:
В результате у нас есть готовый файл с повторяющимися значениями хеша. Мне этого результата было достаточно, но, конечно, можно сделать намного больше, оперируя полученными результатами.
Я не нашел простого и бесплатного решения с GUI, как найти одинаковые файлы на сетевой шаре, поэтому, решил написать скрипт на PowerShell.
Решил искать одинаковые файлы используя значение хеша MD5. Есть два способа получения хеша MD5 в PowerShell:
1. Нужно установить библиотеку Pscx и использовать командлет Get-Hash
2. Использовать вот такую функцию:
function get-md5hash {[System.BitConverter]::ToString((new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider).ComputeHash([System.IO.File]::ReadAllBytes($args)))}
Далее полный листинг скрипта:
$searchpath = "\\ путь к сетевой шаре"
$savepath = "путь к сохранению csv файла"
Get-ChildItem $searchpath -Recurse|`
?{!$_.psiscontainer}|`
Select-Object Name,Fullname,CreationTime,LastWriteTime,Length,@{Name="MD5";Expression={Get-md5hash $_.fullname}}|`
group MD5|?{$_.Count -gt 1}|%{$_.Group}|sort MD5|`
Export-Csv $savepath -NoTypeInformation -Encoding "Unicode"
Объяснение:
Вычисляем MD5 хеш. Применяется ТОЛЬКО к файлам:
function get-md5hash {[System.BitConverter]::ToString((new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider).ComputeHash([System.IO.File]::ReadAllBytes($args)))}
Получаем список файлов:
Get-ChildItem $searchpath –Recurse
Исключая папки:
?{!$_.psiscontainer}
Перечисляем необходимые свойства, которые мы хотим видеть на выходе:
Select-Object Name,Fullname,CreationTime,LastWriteTime,Length,@{Name="MD5";Expression={Get-md5hash $_.fullname}}
, гдеName — имя файла
Fullname — путь к файлу
CreationTime — дата создания файла
LastWriteTime — дата последнего изменения файла
Length — размер, в байтах
Добавляем в свойства файла значение MD5 хеша:
@{Name="MD5";Expression={Get-md5hash $_.fullname}}
Группируем файлы по MD5 хешу:
group MD5
Находим повторения:
?{$_.Count -gt 1}|%{$_.Group}
Сортируем файлы по MD5 хешу:
sort MD5
Экспортируем в .csv файл в формате Unicode:
Export-Csv $savepath -NoTypeInformation -Encoding "Unicode"
В результате у нас есть готовый файл с повторяющимися значениями хеша. Мне этого результата было достаточно, но, конечно, можно сделать намного больше, оперируя полученными результатами.