PowerShellで重複するファイルを探し削除するスクリプト

コンピュータ
MD5でファイルのハッシュを取得して重複ファイルを探すスクリプトを以前作りました。
PowerShellで重複するファイルを探すスクリプト
PowerShellでファイルのハッシュ値を取得するコマンドレット(Get-FileHash)が存在することを知りましたので、ストレージ内で重複するファイルを探すスクリプトを作ってみました。ハッシュ値とファイル名を1行で出力し、重複ファイル...

久々に使う機会があったので、少し手を加えて探した重複ファイルを削除につなげるように作り変えてみました。

スクリプト

ファイル名:Search-DuplicateFile.ps1

<#
.SYNOPSIS
重複するファイルを探すスクリプト

.PARAMETER Help
ヘルプメッセージを表示。

.INPUTS
String または System.IO.FileSystemInfo

.OUTPUTS
重複しているファイルのSystem.IO.FileSystemInfo

.EXAMPLE
PS> .\Search-DuplicateFile.ps1 -Path "~/Pictures/*.jpg"

.EXAMPLE
PS> "~/Pictures/foo.jpg", "~/Pictures/bar.jpg" | .\Search-DuplicateFile.ps1

.EXAMPLE
PS> ls "~/Pictures/*.jpg" | .\Search-DuplicateFile.ps1

#>

param (
    [string]$Path
)


function Search-DuplicateFile
{
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline=$true,Mandatory=$true)]
        [string[]]
        $paths
    )
    begin{
        # 連想配列の初期化
        $array = @{}

    }
    process
    {
        foreach ($p in $paths)
        {
            Get-FileHash -LiteralPath $p -Algorithm MD5 | ForEach-Object {
                if ($array.ContainsKey($_.Hash)) {
                    # 既存
                } else {
                    # 要素の追加
                    $array.Add($_.Hash, (New-Object System.Collections.ArrayList)) | Out-Null
                }
                $array[$_.Hash].Add($_.Path) | Out-Null
            }
        }
    }
    end{
        $array.GetEnumerator() | Where-Object {
            $_.Value.Count -gt 1
        } | ForEach-Object {
            $files = $_.Value
            $files | Sort-Object -Descending | Select-Object -Skip 1 | ForEach-Object {
                Get-ChildItem -LiteralPath $_
            }
        }

    }
}

$a = @($input)

if ($Help -Or ( -Not $Path -And $a.Count -eq 0))
{
    Get-Help $PSCommandPath
    Exit 1
}

if ($a.Count -gt 0)
{
    if ($a[0] -is [System.IO.FileSystemInfo])
    {
        $a | ForEach-Object { $_.FullName } | Search-DuplicateFile
    }
    else
    {
        $a | Search-DuplicateFile
    }
}
else
{
    Get-ChildItem -Path $Path | Search-DuplicateFile
}

使い方

ls ./books/*.zip | . "x:/ps1/Search-DuplicateFile.ps1" | Remove-Item

コメント