PowerShellで重複ファイルを検索・削除する方法
大量のファイルを扱う業務や、長年使っているパソコンでは、同じ内容のファイルが複数存在してしまう「重複ファイル問題」がよく発生します。手動で1つ1つ確認するのは大変で、時間も手間もかかります。この記事では、PowerShellを使って重複ファイルを検索・削除する方法をわかりやすく説明します。コマンドライン操作に慣れていない場合でも、使いやすい重複ファイルファインダーを使用できます。
PowerShellとは
PowerShellは、Microsoftが作った高度なコマンドラインシェルとスクリプト言語で、Windowsの管理や自動化を効率的に行うためのツールです。 従来のコマンドプロンプトよりも遥かに柔軟で強力であり、Windowsの設定変更、ファイル操作、サービス制御、レジストリ操作などをスクリプトで管理できます。
PowerShellは、システム管理者だけでなく、日常的にWindowsを使う中上級ユーザーにも役立ちます。 特に大量のファイルやフォルダを扱う際、繰り返し作業やルールに基づく操作(例:重複ファイルの検出・削除など)を手動で行うのは大変ですが、PowerShellを使うことで数行のスクリプトで一括処理が可能になります。
PowerShellで重複ファイルを検索する基本スクリプト
PowerShellを使って重複ファイルを削除するには、まず重複ファイルを検索し、その後削除する必要があります。検索には、ファイルのハッシュ値やサイズを比較する方法が一般的です。削除は、Remove-Itemコマンドレットを使用します。
重複ファイルを検索するには、いくつかの方法があります。
1. ファイル名とサイズで検索
同じ名前で同じサイズを持つファイルを重複とみなす方法です。この方法は簡単ですが、ファイル名やサイズが異なる場合でも内容が同じファイルを見つけることができません。
2. ハッシュ値で検索
ファイルの内容をハッシュ化し、ハッシュ値が一致するファイルを重複とみなす方法です。この方法は、ファイル名やサイズが異なる場合でも内容が同じファイルを検出できますが、処理に時間がかかる場合があります。
- 例(ファイル名とサイズで検索)
-
$targetFolder = "C:\対象フォルダ" # 検索対象のフォルダを指定$duplicates = @{}Get-ChildItem -Path $targetFolder -File | ForEach-Object {$key = $_.Length.ToString() + $_.Name # サイズと名前をキーとするif ($duplicates.ContainsKey($key)) {$duplicates[$key] += $_} else {$duplicates[$key] = @($_)}}$duplicates.GetEnumerator() | Where-Object {$_.Value.Count -gt 1} | ForEach-Object {Write-Host "重複ファイルグループ:" $_.Key$_.Value | ForEach-Object {Write-Host "`t" $_.FullName}}
- 例(ハッシュ値で検索)
-
$targetFolder = "C:\対象フォルダ" # 検索対象のフォルダを指定$hashes = @{}Get-ChildItem -Path $targetForest -File | ForEach-Object {$hash = Get-FileHash $_.FullName -Algorithm SHA256 | Select-Object -ExpandProperty Hashif ($hashes.ContainsKey($hash)) {$hashes[$hash] += $_} else {$hashes[$hash] = @($_)}}$hashes.GetEnumerator() | Where-Object {$_.Value.Count -gt 1} | ForEach-Object {Write-Host "重複ファイルグループ:" $_.Key$_.Value | ForEach-Object {Write-Host "`t" $_.FullName}}
PowerShellで重複ファイルを自動削除するスクリプト例
検索結果に基づいて、削除したいファイルを特定し、Remove-Itemコマンドレットで削除します。
- 例(ハッシュ値で検索した結果から、2つ目以降のファイルを削除)
-
$targetFolder = "C:\対象フォルダ" # 検索対象のフォルダを指定 $hashes = @{}Get-ChildItem -Path $targetFolder -File | ForEach-Object {$hash = Get-FileHash $_.FullName -Algorithm SHA256 | Select-Object -ExpandProperty Hashif ($hashes.ContainsKey($hash)) {$hashes[$hash] += $_} else {$hashes[$hash] = @($_)}}$hashes.GetEnumerator() | Where-Object {$_.Value.Count -gt 1} | ForEach-Object {$files = $_.Valuefor ($i = 1; $i -lt $files.Count; $i++) {Write-Host "削除:" $files[$i].FullNameRemove-Item $files[$i].FullName -Force # -Forceオプションで確認なしで削除}}
-
Remove-Itemコマンドレットの`-Force`オプションは、削除の確認をスキップします。誤って必要なファイルを削除しないように、注意して使用してください。
-
削除前に、必ずバックアップを取ることをお勧めします。
-
上記は基本的なスクリプトです。実際の環境に合わせて、ファイル名やハッシュ値の比較方法、削除対象のファイルの選択方法などを調整してください。
Partition Assistant for CleanupでGUIベースの安全削除を併用する
スクリプトでの操作に不安がある方や、もっと直感的に重複をチェックしたい方には、Partition Assistant for Cleanupの「重複ファイル検索」機能がぴったりです。
- ▶ スクリプトに不安がある人向けの安心操作
- ワンクリックでフォルダ・ドライブ全体をスキャン
- サイズやハッシュ一致のファイルを一括抽出
- 削除候補のプレビュー・選択が可能
操作がすべてGUIベースなので、コマンドミスや誤操作の心配が一切ありません。
加えて、このツールには他にもディスクの不要ファイル削除機能や大容量ファイル検索などの便利な機能が搭載されており、パソコン最適化を実現できます。
ステップ 1. Partition Assistant for Cleanupをダウンロード、インストールして起動します。「重複ファイルの検索」タブをクリックします。「スキャン開始」をクリックしてシステムドライブのスキャンを開始するか、「カスタムスキャン」をクリックしてスキャンするパスを手動で選択できます(ここでは「カスタムスキャン」を例に説明します)。
ステップ 2. 「カスタムスキャン」をクリックすると、PC上のすべてのローカルドライブと外付けドライブが表示されます。「パスを追加」ボタンをクリックすると、フォルダ参照ウィンドウがポップアップ表示されます。デスクトップ、ダウンロードフォルダ、その他のフォルダパスなど、PC上のパスを追加できます。
ステップ 3. 必要なパスを追加したら、「スキャン開始」ボタンをクリックしてスキャン処理を開始します。
ステップ 4. スキャン処理には時間がかかる場合があります。スキャンが完了すると、すべての重複ファイルがリストされます。重複ファイルを手動で選択するか、「スマート選択」ボタンをクリックして不要な重複ファイルを自動的に選択して削除できます。
後ろのボタンをクリックして、それらのファイルの中身を確認できます。
すべての重複ファイルを手動で選択した場合、重複ファイルの少なくとも1つのコピーを残すように求めるポップアップ警告ウィンドウが表示されます。すべての重複ファイルを削除する場合は、「OK」をクリックすると、すべての重複ファイルが削除対象として選択されます。
ステップ 5. 不要な重複ファイルを選択したら、「今すぐ削除」ボタンをクリックして削除を開始します。
ステップ 6. 削除には時間がかかる場合があります。処理が完了すると、選択したファイルが削除され、削除されたデータの合計量を示す「クリーンアップ完了」ウィンドウが表示されます。
まとめ
PowerShellは、Windows環境でのファイル管理や自動化において非常に強力なツールであり、重複ファイルの検索や削除にも役立ちます。特にスクリプトを使用することで、目視では見つけにくい重複ファイルを正確に検出・処理できますが、操作ミスによるファイルの誤削除のリスクもあります。
そのため、PowerShellの優れた検出機能と、Partition Assistant for CleanupのようなGUIツールによる直感的な削除操作を組み合わせることで、安全かつ効率的に重複ファイルを整理できます。手軽さと正確性を両立させた方法として、特に多くのファイルを管理するユーザーにとって非常に有効な選択肢となるでしょう。