В современном цифровом мире количество информации растет с невероятной скоростью. Мы часто сохраняем одни и те же файлы в разных папках, даже не замечая этого. Дублирующиеся файлы занимают драгоценное место на диске и могут усложнить поиск нужных данных. Автоматизация поиска и удаления таких дубликатов помогает эффективно управлять файлами.
В этой статье мы разработаем PowerShell-скрипт, который найдет и удалит дублирующиеся файлы, основываясь на их содержимом (контрольная сумма), размере и имени. Это идеальный инструмент для системных администраторов, IT-специалистов и просто для тех, кто хочет организовать свои данные.
Почему PowerShell?
PowerShell — это мощный инструмент для автоматизации задач в Windows. Он обладает следующими преимуществами:
- Встроенные модули для работы с файлами.
- Простота использования и возможность интеграции в Windows Scheduler для планирования задач.
- Никакой установки стороннего ПО — всё работает на системном уровне.
1. Получение списка файлов
Сначала нам нужно получить полный список файлов в указанной папке и её подкаталогах.
# Укажите папку для анализа
$folderPath = "C:\YourFolder"
# Получаем список всех файлов, включая вложенные папки
$files = Get-ChildItem -Path $folderPath -File -Recurse
# Вывод списка файлов
Write-Host "Найдено $($files.Count) файлов в $folderPath"
2. Сравнение файлов на основе размера
На первом этапе отбора мы будем сравнивать файлы по их размеру, чтобы исключить файлы разного размера.
# Группируем файлы по размеру
$fileGroups = $files | Group-Object Length | Where-Object { $_.Count -gt 1 }
# Выводим группы файлов одинакового размера
foreach ($group in $fileGroups) {
Write-Host "Группа файлов размером $($group.Name) байт:"
$group.Group | ForEach-Object { Write-Host $_.FullName }
}
3. Проверка дубликатов по контрольной сумме (MD5)
Контрольная сумма файла (MD5) позволяет определить, идентичны ли два файла.
# Функция для вычисления MD5
function Get-FileHashMD5 {
param ([string]$filePath)
$hasher = [System.Security.Cryptography.MD5]::Create()
$fileStream = [System.IO.File]::OpenRead($filePath)
$hash = $hasher.ComputeHash($fileStream)
$fileStream.Close()
[BitConverter]::ToString($hash) -replace "-", ""
}
# Сравниваем файлы в группах
$duplicateFiles = @()
foreach ($group in $fileGroups) {
$hashTable = @{}
foreach ($file in $group.Group) {
$hash = Get-FileHashMD5 -filePath $file.FullName
if ($hashTable.ContainsKey($hash)) {
$duplicateFiles += $file.FullName
} else {
$hashTable[$hash] = $file.FullName
}
}
}
# Вывод дубликатов
Write-Host "Найдено $($duplicateFiles.Count) дубликатов:"
$duplicateFiles | ForEach-Object { Write-Host $_ }
4. Удаление дубликатов
Теперь мы можем добавить логику для удаления дубликатов. Чтобы избежать случайного удаления важных данных, добавим подтверждение перед удалением.
# Удаление дубликатов с подтверждением
foreach ($file in $duplicateFiles) {
$response = Read-Host "Удалить файл $file? (y/n)"
if ($response -eq 'y') {
Remove-Item -Path $file -Force
Write-Host "Файл $file удален." -ForegroundColor Green
} else {
Write-Host "Файл $file оставлен." -ForegroundColor Yellow
}
}
5. Генерация лог-файла
Для ведения учёта удалённых файлов создадим текстовый файл с записью действий.
# Лог-файл
$logFilePath = "C:\DuplicateLog.txt"
# Запись в лог
foreach ($file in $duplicateFiles) {
Add-Content -Path $logFilePath -Value "Удален файл: $file"
}
Write-Host "Лог действий сохранён в $logFilePath"
Готовый скрипт
Объединим все шаги в один готовый скрипт:
# Путь к папке для анализа
$folderPath = "C:\YourFolder"
# Функция для вычисления MD5
function Get-FileHashMD5 {
param ([string]$filePath)
$hasher = [System.Security.Cryptography.MD5]::Create()
$fileStream = [System.IO.File]::OpenRead($filePath)
$hash = $hasher.ComputeHash($fileStream)
$fileStream.Close()
[BitConverter]::ToString($hash) -replace "-", ""
}
# Получение всех файлов
$files = Get-ChildItem -Path $folderPath -File -Recurse
# Группировка по размеру
$fileGroups = $files | Group-Object Length | Where-Object { $_.Count -gt 1 }
# Нахождение дубликатов
$duplicateFiles = @()
foreach ($group in $fileGroups) {
$hashTable = @{}
foreach ($file in $group.Group) {
$hash = Get-FileHashMD5 -filePath $file.FullName
if ($hashTable.ContainsKey($hash)) {
$duplicateFiles += $file.FullName
} else {
$hashTable[$hash] = $file.FullName
}
}
}
# Удаление дубликатов
foreach ($file in $duplicateFiles) {
$response = Read-Host "Удалить файл $file? (y/n)"
if ($response -eq 'y') {
Remove-Item -Path $file -Force
Write-Host "Файл $file удален." -ForegroundColor Green
} else {
Write-Host "Файл $file оставлен." -ForegroundColor Yellow
}
}
# Логирование
$logFilePath = "C:\DuplicateLog.txt"
foreach ($file in $duplicateFiles) {
Add-Content -Path $logFilePath -Value "Удален файл: $file"
}
Write-Host "Лог сохранён: $logFilePath"
Заключение
Этот PowerShell-скрипт поможет эффективно находить и удалять дублирующиеся файлы, освобождая место на диске. Вы можете настроить его под свои нужды, например, автоматически удалять старые файлы или интегрировать в Планировщик задач для регулярного анализа.
Если вы хотите расширить функционал, например, добавив графический интерфейс или поддержку сетевых хранилищ, PowerShell позволяет это сделать. Надеюсь, статья окажется полезной в вашей работе!