яндекс
Как найти и удалить дублирующиеся файлы с помощью PowerShell

В современном цифровом мире количество информации растет с невероятной скоростью. Мы часто сохраняем одни и те же файлы в разных папках, даже не замечая этого. Дублирующиеся файлы занимают драгоценное место на диске и могут усложнить поиск нужных данных. Автоматизация поиска и удаления таких дубликатов помогает эффективно управлять файлами.

В этой статье мы разработаем 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 позволяет это сделать. Надеюсь, статья окажется полезной в вашей работе!

Добавить комментарий