【完全ガイド】PowerShellで重複ファイルを検索する

PowerShellを使用して重複ファイルを検索することは、コマンドに慣れないユーザーにとってちょっと難しいかもしれません。この記事では、PowerShellを使用して重複ファイルを探して削除する具体的な手順を示します。さらに、難しい操作なしに重複ファイルを検索して削除するためのよりユーザーフレンドリーな重複ファイル検索、削除ソフトを紹介します。

投稿者 @ひとみ 2024年04月30日 @ひとみ 最後の更新 2023年12月19日

PowerShellを使用して重複ファイルを検索できますか?

もちろん、Windowsコンピュータで重複ファイルを検索するためにPowerShellを使用することができます。PowerShellは、コマンドラインシェル、スクリプト言語、および構成管理フレームワークで構成されるクロスプラットフォームのタスク自動化ソリューションです。PowerShellはWindows、Linux、およびmacOS上で実行されます。これは.NETフレームワーク上に構築されており、多くのシステム機能やライブラリにアクセスすることができ、幅広いユーザーにとって不可欠なツールとなっています。

PowerShellの特徴
コマンドレットを使える:PowerShellでは、従来の「コマンド」をわかりやすくした「コマンドレット」を利用することができます。コマンドレットは「動詞-名詞」という命名規則で作られており、従来よりも直感的にコマンドの内容を把握しやすいことが特徴です。
Microsoftサービスも操作できる:PowerShellを使うことで、Office 365やExchangeといったMicrosoftが提供するクラウドサービスを操作することができます。
複数の命令を組み合わせて高度な処理を実行できる:PowerShellを使うメリットとして、コマンドプロンプトでは不可能だった命令を組み合わせる機能(パイプライン)が備わっている点が挙げられます。

PowerShellの柔軟性と拡張性により、Windows PC上で重複ファイルを探して削除するための重要なツールとなります。さまざまな基準に基づいて、コンテンツ、名前、サイズなどを含む重複ファイルを検索し、特定のコマンドとスクリプトを使用してそれらを安全に削除して、ディスク領域を解放することができます。

PowerShellで重複ファイルを検索

この部分では、PowerShellを使用して重複ファイルを検索して削除する方法についてのステップバイステップのガイドを提供し、この目標を達成するためのスクリプトを示します。

注意: ✍間違ったコマンドを入力するとデータを失ったり、他の取り返しのつかない結果に遭遇する可能性があります。正しいコマンドを理解して入力することを確認してください。

▶パート1.Get-FileHashで重複ファイルを検索する

PowerShellのGet-FileHashコマンドレットは、指定されたハッシュアルゴリズムを使用して、ファイルのハッシュ値を計算します。ハッシュ値とは、ファイルの内容に対応する一意の値です。ハッシュは、ファイルの内容をファイル名や拡張子などの指定で識別するのではなく、ファイルの内容に一意の値を割り当てます。この記事では、重複ファイルを識別するためにハッシュ値を利用します。以下のコマンドを入力します。

Get-FileHash -Path file_path -Algorithm hashing_algorithm

検索したいファイルの特定の保存パスを入力する必要があります。

🔔例:Get-FileHash -Path 'D:\ISO\WinPE.iso' -Algorithm SHA512

Get-FileHashコマンドレットは、特にインターネットからデータをダウンロードする際にファイルの整合性を検証するために使用されます。ハッシュ方法が指定されない場合、デフォルトはSHA256です(ほとんどの状況では十分)。Get-FileHashはパイプライン処理をサポートしており、Get-ChildItemコマンドレットと組み合わせて使用することで、Get-ChildItemによって提供された各アイテムのハッシュを計算することができます。

豆知識: 💿パイプライン処理(|)は、CPUなどのプロセッサの性能を向上させるための技術のひとつであり、複数の命令を並行して実行するための方式です。 💿「Get-ChildItem」は、ディレクトリ情報を取得するためのコマンドレットです。例えば、ファイルやフォルダなどの情報を取得することができます。

それでは、一緒にGet-FileHashコマンドレットを使用して重複ファイルを検索する具体的な手順を見ていきましょう。

🎃オプション1.ハッシュ値に基づいて重複ファイルを検索

以下のコマンドは、再帰的にフォルダ内のすべてのファイルを取得し、それらのハッシュを生成するためにGet-FileHashに渡し、一致するハッシュ値に基づいてそれらをグループ化します。Get-FileHashコマンドレットの結果に応じて、パスを置き換える必要があります。

豆知識: 💿再帰的処理とは同じ処理を繰り返すという意味です。

$srcDir = "D:\MyScripts"(ケースに合わせてパスを変更する)
Get-ChildItem $srcDir -File -Recurse `
 | Get-FileHash | Group -Property Hash `
 | where {$_.Count -gt 1} | foreach { $_.Group | select Path, Hash}

このコマンドは小さいファイルに最適ですが、ソースディレクトリに大量の大容量のファイルがある場合、それらを削除する時エラーが発生する可能性があります。

前述のプログラムはファイルのサイズに関係なくすべてのファイルのハッシュ値を計算することは時間のかかる手続きです。大量のファイルを持つディレクトリに対し、Get-FileHashコマンドレットは重複ファイルを探すのに非常に長い時間がかかる可能性があります。

🎃オプション2.ファイルサイズとハッシュ値に基づいて重複ファイルを検索

上記のコマンドと比較して、ファイルサイズとハッシュ値に基づいて重複ファイルを検索する方が最適化されています。

ファイルのサイズは一致する必要があり、つまり異なるサイズのファイルは重複と見なされません。おそらくGet-ChildItem PowerShellコマンドレットの長さプロパティにはおなじみでしょう。ディレクトリからファイルサイズを取得するため、ハッシュ値を計算する必要がありません。

豆知識: 💿Get-ChildItem、Get-Itemでファイル名を指定し、Lengthプロパティを表示すれば簡単にファイルサイズ(バイト数)を簡単に取得することができます。

秘訣は、同じサイズのファイルに対してのみハッシュ値を計算することです。異なるサイズのファイルは重複しないことをすでに知っているため、この方法でコマンドの全体的な実行時間が大幅に短縮されます。Get-FileHashの結果に応じて、パスを置き換える必要があります。

$srcDir = "D:\ISO Files"(ケースに合わせてパスを変更する)
Get-ChildItem -Path $srcDir -File -Recurse | Group -Property Length `
    | where { $_.Count -gt 1 } | select -ExpandProperty Group | Get-FileHash `
    | Group -Property Hash | where { $_.count -gt 1 }| foreach { $_.Group | select Path, Hash }

このコマンドは、同じサイズのファイルをグループ化し、それらのファイルをGet-FileHashに送ってハッシュ値を計算します。

▶パート2.PowerShellで重複ファイルを削除する

PowerShellのGet-FileHashコマンドレットを使って重複ファイルを見つけた後、それらを適切に処理する必要があります。重要なファイルを扱う際には、すぐに重複ファイルを削除することはお勧めできません。代わりに、それらを十分な空きスペースがある別のディレクトリに移動することができます。PowerShellで削除したくない重要なファイルやフォルダを移動する場合、Move-Itemコマンドレットを使います。

豆知識: 💿Move-Itemコマンドレットは、プロパティ、コンテンツ、子項目を含む項目を、ある場所から別の場所に移動します。移動元と移動先は、どちらも同じプロバイダーでサポートされている必要があります。たとえば、ファイルやサブディレクトリを別のディレクトリに移動したり、レジストリのサブキーを別のキーに移動したりできます。

# Define source directory
$srcDir = "D:\ISO Files"(ケースに合わせてパスを変更する)
# Define destination directory
$targetDir = "E:\DuplicateFiles\$(Get-Date -Format 'yyyyMMdd')"(ターゲットファイルはここに保存される)
# Create destination directory
if(!(Test-Path -PathType Container $targetDir)){ New-Item -ItemType Directory -Path $targetDir | Out-Null }
# Move duplicate files to a different location
Get-ChildItem -Path $srcDir -File -Recurse | group -Property Length | where { $_.Count -gt 1 } `
        | select -ExpandProperty Group | Get-FileHash | group -Property Hash `
        | where { $_.Count -gt 1 }| foreach { $_.Group | select -Skip 1 } `
        | Move-Item -Destination $targetDir -Force -Verbose

★注意:
注意すべきポイントは、「-Skip 1」を使用して、1つのファイルをソースディレクトリに残したまま、他の重複ファイルを指定したターゲットディレクトリに移動しました。一度移動したら、後で手動で確認し、必要に応じて削除することができます。でも、数百万のファイルを含む大きなソースディレクトリを処理している場合、Move-Itemに「-verbose」パラメータを使用しない方がいいです。

ディレクトリに数ファイルしか含まれていない場合、手動でどれを移動し、どれをソースディレクトリに残すかを選択することができます。

# Define source directory
$srcDir = "D:\ISO Files"(ケースに合わせてパスを変更する)
# Define destination directory
$targetDir = "E:\DuplicateFiles\$(Get-Date -Format 'yyyyMMdd')"(ターゲットファイルはここに保存される)
# Create destination directory
if(!(Test-Path -PathType Container $targetDir)){ New-Item -ItemType Directory -Path $targetDir | Out-Null }
# Manually choose duplicate files to move to target directory
Get-ChildItem -Path $srcDir -File -Recurse | Group -Property Length `
    | where { $_.Count -gt 1 } | select -ExpandProperty Group | Get-FileHash `
    | Group -Property Hash | where { $_.count -gt 1 } | foreach { $_.Group | select Path, Hash } `
    | Out-GridView -Title "Select the file(s) to move to `"$targetDir`" directory." -PassThru `
    | Move-Item -Destination $targetDir -Force -Verbose

ファイルのバックアップがある場合、PowerShellを使用して重複ファイルを直接移動することもできます。

# Define source directory
$srcDir = "D:\ISO Files"
# Permanently delete duplicate files; use with caution
Get-ChildItem -Path $srcDir -File -Recurse | group -Property Length | where { $_.Count -gt 1 } `
        | select -ExpandProperty Group | Get-FileHash | group -Property Hash `
        | where { $_.Count -gt 1 }| foreach { $_.Group | select -Skip 1 } `
        | Remove-Item -Force -Verbose

プロな重複ファイル削除ソフトで重複ファイルを検索

PowerShellを使用して重複ファイルを検索および削除することは可能ですが、そのコマンドは非常に複雑で、使用するにはリスクがあります。プロセス中のたった1つのミスが、ファイルディレクトリを破損する可能性があります。そのような場合、ユーザーフレンドリーな重複ファイル検索、削除ソフトが不可欠となります。ここで、すべてのWindows PCと互換性のある多機能なディスクおよびパーティション管理ソフトであるAOMEI Partition Assistant Professionalをお勧めします。

その「重複ファイルファインダー」機能を使用して、迅速かつ効率的に重複ファイルを探し、削除することができます。画像、ビデオ、オーディオ、ドキュメント、アーカイブなどのファイル形式に対応します。また、この機能はファイル形式を選択して、削除することができます。例えば、jpgファイルのみを削除することができます。さらに、複雑なコマンドを使用せずにデバイスで自動的なクリーニング計画を定期実行することもできます。

Proのデモ版 Win 11/10/8.1/8/7/XP
安全かつ快適
注:デモ版は動作確認の目的でのみ使用されます。つまり、デモでは、すべての機能をプレビュー、すべての操作をシミュレートすることしかできません。

ステップ 1. AOMEI Partition Assistantを起動し、メインタブの「空間を解放」をクリックし、「重複ファイルファインダー」を選択します。

ステップ 2. ここでは、コンピュータ上のすべてのパーティションが表示されます。カスタマイズして「スキャン」をクリックして、重複ファイルの検索を開始します。この画面下の「すべて」タブで除外するファイル形式を指定して、特定の拡張子のファイルをスキャンの対象から外すことができます。また「ピクチャ」「ビデオ」「オーディオ」「ドキュメント」「アーカイブ ファイル」に対して、含めるファイル形式を指定して、特定の拡張子のファイルのみをスキャンすることができます。

ステップ 3. 処理が完了すると、設定した条件を満たすすべての重複ファイルが表示されます。「プレビュー」ボタンをクリックすると、重複ファイルの詳細情報を確認することができます。

🎨「詳細設定」をクリックして、スキャンルールを個別に設定することもできます。例えば、指定した「作成日時」や「更新日時」で検索したり、スキャンできる最小ファイルサイズを変更したり、スキャン時システムファイル/プログラムファイル/隠しフォルダーをスキップしたり、ファイル比較方法を選択することができます。

手動選択で重複ファイルを削除

1. 削除したい重複ファイルを手動で選択します。

💡ヒント:「チェックを外す」ボタンをクリックすると、選択したすべてのファイルがチェックされていない状態になります。

🎯重要:通常、グループごとに少なくとも1つのファイルを保持することをお勧めします。グループ内のすべてのファイルを選択した場合、「グループ全体を削除してもよろしいですか?」というメッセージが表示されます。確認したら、「OK」をクリックします。

2. 「設定」をクリックして、適切な削除方法を選択するか、「個人用設定」をカスタマイズすることができます。設定の変更を保存するために、「はい」をクリックします。ここでは「ゴミ箱に移動」を例に取りましょう。

3つの削除方法
直接削除:選択した重複ファイルはゴミ箱などへ移動せず、直接完全にパソコンから削除されます。
ゴミ箱に移動(デフォルト設定):選択した重複ファイルはコンピューターのゴミ箱に移動されます。ゴミ箱からファイルを復元することができます。
指定したフォルダに移動:選択した重複ファイルは指定した場所に移動されます。重複ファイルを保存する場所を指定・設定することができます。
個人用設定(「スマート選択」用、手動選択の場合このオプションを設定する必要はない)
最後/最初の変更:「スマート選択」をクリックすると、最後/最初に変更したファイルが選択されます(最後の変更がデフォルト設定されます)。
最後/最初の作成:「スマート選択」をクリックすると、最後/最初に作成したファイルが選択されます(最後の作成がデフォルト設定されます)。
グループ内で最も長い/短いファイル名:「スマート選択」をクリックすると、グループ内で最長/最短の名前を持つファイルが選択されます(最も長いがデフォルト設定されます)。
グループ内で最も長い/短いファイルパス:「スマート選択」をクリックすると、グループ内で最長/最短のパスのファイルが選択されます(最も長いがデフォルト設定されます)。
一致するファイル名/ファイルパス:一致させたいファイル名/ファイルパスを「一致オプション」欄に入力します。入力したファイル名/ファイルパスと一致する場合のみ、「スマート選択」で選択されます。

3. 「ゴミ箱に移動」ボタンをクリックして、手動で選択した重複ファイルを削除します。

4. 削除が完了したあと、詳細情報を確認することができます。

🔊ヒント:削除した重複ファイルはゴミ箱に移動されるため、コンピューターのゴミ箱から、削除したファイルを見つけたり、「元に戻す」で復元することができます。

スマート選択で重複ファイルを削除

「スマート選択」は「設定」に基づいています。

1. 「設定」では、削除方法を変更・選択するか、「個人用設定」をカスタマイズすることができます。設定の変更を保存するには、「はい」をクリックします。ここでは「指定したフォルダに移動」を例に取りましょう(「D:\」を保存場所として選択します)。

2. 「スマート選択」をクリックすると、「お好み設定」に従って一部の重複ファイルが自動的に選択されます。

💡ヒント:「チェックを外す」ボタンをクリックすると、選択したすべてのファイルがチェックされていない状態になります。

3. 「指定したフォルダに移動」ボタンをクリックして、スマート選択で重複ファイルを削除します。

4. 削除が完了するまで時間がかかる場合があります。完了したあと、詳細情報を確認することができます。

🔊ヒント:削除した重複ファイルは指定した場所(D:\)に移動されるため、移動先から、削除したファイルを見つけたり、操作(削除、コピー、切り取り、名前の変更など)することができます。

まとめ

PowerShellはWindowsユーザーにとってシステム設定を変更するための非常に実用的なツールです。ただし、パソコン初心者にとってはあまりフレンドリーではありません。したがって、単に重複ファイルをクリーンアップしたい場合、重複ファイルの削除ソフトAOMEI Partition Assistant Professionalがお勧めです。このソフトを利用して、簡単かつ迅速に重複ファイルを削除することができます。

もし大事なファイルを誤って削除してしまった場合、AOMEI Partition Assistant Professionalの「データ復元」機能を利用して、削除したファイルを復元することができます。念のためにデータをバックアップしたい場合、「ディスクをクローン」機能を利用することもできます。また、コンピュータのパフォーマンスを向上させるために、空き領域の割り当て、インストールされたアプリの移動などの多くの便利な機能が備わっています。

さらに、Windows Serverシステム向けのServer版も提供されています。