Duplikációk keresése, avagy power shell script íratása AI-val

Futurisztikus digitális mappa és műszerfal, amely a duplikált fájlok keresését és azonosítását szemlélteti
Becsült olvasási idő:
3 perc

Ma ilyen AI-s napom van. Egyre jobban tör be a mindennapi munkámba, és úgy tűnik, hogy a hétvégeimet is ez teszi ki. Miért? Kérdezheted joggal. Megmondom. Az IT-ban, de gyanítom a többi szakmában is jobb, ha értünk hozzá, és megtanuljuk rutinosan használni, mintsem lemaradjunk róla, és nézzük bambán, ahogy az élet felsuhan előttünk.

Nézzük, mire is mentem elsőre.

Az alábbi PowerShell-script végigpásztázza a megadott mappát (és annak almappáit), a fájlok SHA256 hash értéke alapján azonosítja a duplikációkat, majd az eredményt kiírja a képernyőre és elmenti egy CSV-fájlba.

PowerShell duplikáció-kereső script

Hozz létre egy find-duplicates.ps1 fájlt, és másold bele az alábbi kódot:

PowerShell

# --- BEÁLLÍTÁSOK ---
$TargetFolder = "C:\Elérési\Út\A\Mappához"   # Cseréld ki a vizsgálandó mappa útvonalára
$OutputFile   = "C:\Elérési\Út\duplikatumok.csv" # Ide menti az eredményt

Write-Host "Fájlok indexelése és hash értékek számítása..." -ForegroundColor Cyan

# 1. Összes fájl lekérése és méret szerinti csoportosítása (gyorsítási lépés)
$fileGroups = Get-ChildItem -Path $TargetFolder -Recurse -File -ErrorAction SilentlyContinue |
    Group-Group-Object -Property Length |
    Where-Object { $_.Count -gt 1 }

$duplicates = @()
$totalGroups = $fileGroups.Count
$counter = 0

# 2. Csak az azonos méretű fájlok SHA256 hash-ének ellenőrzése
foreach ($group in $fileGroups) {
    $counter++
    Write-Progress -Activity "Duplikátumok keresése" -Status "Fájlcsoportok feldolgozása: $counter / $totalGroups" -PercentComplete (($counter / $totalGroups) * 100)

    $hashTable = $group.Group | Get-FileHash -Algorithm SHA256 | Group-Object -Property Hash | Where-Object { $_.Count -gt 1 }

    foreach ($hashGroup in $hashTable) {
        foreach ($file in $hashGroup.Group) {
            $duplicates += [PSCustomObject]@{
                Hash     = $hashGroup.Name
                Path     = $file.Path
                SizeMB   = [math]::Round((Get-Item $file.Path).Length / 1MB, 2)
            }
        }
    }
}

# 3. Eredmények megjelenítése és mentése
if ($duplicates.Count -gt 0) {
    Write-Host "`nTalált duplikátumok:" -ForegroundColor Green
    $duplicates | Format-Table -AutoSize -Property Hash, SizeMB, Path

    $duplicates | Export-Csv -Path $OutputFile -NoTypeInformation -Encoding UTF8
    Write-Host "Az eredmények elmentve ide: $OutputFile" -ForegroundColor Yellow
} else {
    Write-Host "`nNem találhatók duplikált fájlok." -ForegroundColor Green
}

Így használd:

  1. Nyisd meg a PowerShell-t (akár Rendszergazdaként, ha védett mappákat is vizsgálsz).
  2. Írd át a $TargetFolder változót a keresni kívánt mappára.
  3. Futtasd a scriptet:PowerShell.\find-duplicates.ps1

Megjegyzés: Ha a PowerShell letiltja a scriptek futtatását, futtasd ezt a parancsot a munkamenetben:

Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

Majd második próbálkozásra

Módosítottam a scriptet, hogy a célmappát (és opcióként a kimeneti CSV-fájl helyét is) paraméterként fogadja el.

A módosított script kódja:

PowerShell

<#
.SYNOPSIS
    Fájl duplikációkat kereső és gyűjtő PowerShell script.

.DESCRIPTION
    A script végigpásztázza a paraméterként megadott mappát (és annak almappáit),
    és az SHA256 hash értékek alapján azonosítja a duplikátumokat.
    Az eredményt megjeleníti a konzolon és CSV-fájlba menti.

.PARAMETER TargetFolder
    A vizsgálandó mappa útvonala (kötelező paraméter).

.PARAMETER OutputFile
    A kimeneti CSV fájl útvonala (opcionális, alapértelmezett: .\duplikatumok.csv).
#>

[CmdletBinding()]
param(
    [Parameter(Mandatory = $true, Position = 0, HelpMessage = "Kérjük, adja meg a vizsgálandó mappa útvonalát!")]
    [ValidateScript({ Test-Path $_ -PathType Container })]
    [string]$TargetFolder,

    [Parameter(Mandatory = $false, Position = 1)]
    [string]$OutputFile = ".\duplikatumok.csv"
)

# Abszolút útvonalak feloldása
$TargetFolder = (Resolve-Path $TargetFolder).Path
$OutputFile   = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($OutputFile)

Write-Host "Mappa elemzése: $TargetFolder" -ForegroundColor Cyan
Write-Host "Fájlok indexelése és méret szerinti csoportosítása..." -ForegroundColor Cyan

# 1. Összes fájl lekérése és méret szerinti csoportosítása (gyorsítási lépés)
$fileGroups = Get-ChildItem -Path $TargetFolder -Recurse -File -ErrorAction SilentlyContinue |
    Group-Object -Property Length |
    Where-Object { $_.Count -gt 1 }

$duplicates = @()
$totalGroups = $fileGroups.Count
$counter = 0

if ($totalGroups -eq 0) {
    Write-Host "`nNem találhatók azonos méretű fájlok, nincsenek duplikátumok." -ForegroundColor Green
    exit
}

# 2. Csak az azonos méretű fájlok SHA256 hash-ének ellenőrzése
foreach ($group in $fileGroups) {
    $counter++
    Write-Progress -Activity "Duplikátumok keresése" -Status "Fájlcsoportok feldolgozása: $counter / $totalGroups" -PercentComplete (($counter / $totalGroups) * 100)

    $hashTable = $group.Group | Get-FileHash -Algorithm SHA256 | Group-Object -Property Hash | Where-Object { $_.Count -gt 1 }

    foreach ($hashGroup in $hashTable) {
        foreach ($file in $hashGroup.Group) {
            $duplicates += [PSCustomObject]@{
                Hash     = $hashGroup.Name
                Path     = $file.Path
                SizeMB   = [math]::Round((Get-Item $file.Path).Length / 1MB, 2)
            }
        }
    }
}

# 3. Eredmények megjelenítése és mentése
if ($duplicates.Count -gt 0) {
    Write-Host "`nTalált duplikátumok:" -ForegroundColor Green
    $duplicates | Format-Table -AutoSize -Property Hash, SizeMB, Path

    $duplicates | Export-Csv -Path $OutputFile -NoTypeInformation -Encoding UTF8
    Write-Host "Az eredmények elmentve ide: $OutputFile" -ForegroundColor Yellow
} else {
    Write-Host "`nNem találhatók duplikált fájlok." -ForegroundColor Green
}

Használati példák:

  1. Alapértelmezett használat (a mappa elérést megadva, az eredmény a beállítások szerint a duplikatumok.csv-be kerül):PowerShell.\find-duplicates.ps1 -TargetFolder "C:\Users\Public\Documents"
  2. Pozicionális paraméterként (nem kell kiírni a névadó kapcsolót):PowerShell.\find-duplicates.ps1 "D:\Képek"
  3. Egyedi CSV kimeneti fájlnév megadásával:PowerShell.\find-duplicates.ps1 -TargetFolder "D:\Dokumentumok" -OutputFile "C:\Riportok\doksi_duplikatumok.csv"

Újdonságok a scriptben:

  • Automatikus mappa-ellenőrzés (ValidateScript): Ha nem létező vagy hibás mappa-útvonalat adsz meg, a script még a futás előtt jelez és leáll.
  • Mappa-kötelezőség (Mandatory = $true): Ha paraméter nélkül indítod el a scriptet, a PowerShell automatikusan megkérdezi tőled a célmappa útvonalát.

Nem vagyok teljes mértékben elragadtatva az eredménytől, de mára ez bőven elég volt, majd folytatjuk…

Szerző:
Kategória:
, ,
Bejegyzés dátuma:

Hozzászólások

Vélemény, hozzászólás?