powershellで特定の条件に引っかかるディレクトリ・ファイルを削除します。
OSはWindows10です。
ディレクトリ内に雑多に多くの種類のファイルがあったのですが、関係者への提供のために特定のファイルのみ抽出して提供する必要がありました。
ディレクトリは第2階層で数百あり、さらにそれぞれに下の階層があり手作業はこの遠くなる作業でしたのでpowershellで実行しました。
特定のディレクトリ・ファイルを一括削除する方法
方法は他にもありますが、この記事ではGet-ChildItemで特定のディレクトリ・ファイルを抽出し、Remove-Itemで削除します。
個人のやりたいことに合わせて変える必要がありますが、結果として使用するコマンドは下記のようになると思います。
Get-ChildItem -File -Path D:/test -Recurse -Include ._* -Force | Remove-Item -Recurse -Force
私は上記でD:/test配下に存在する._で始まるファイルを一括で削除しています。
この話には関係ありませんが、._で始まるファイルはMac OSでよく作成されます。
私はMacをほとんど使用しないためあまりよく分からないのですが、Mac上では基本的に見えない管理用ファイルだそうです。
Windowsで扱う分には不要なファイルなので削除しました。
Get-ChildItemでディレクトリ・ファイルを取得する
Get-ChildItemはPowershellのコマンドでパスのディレクトリやファイルの一覧を取得できます。
Get-ChildItem [パス]
これにオプションを加えていき、やりたいことにコマンドを近づけていきます。
まずは-Fileをつけてディレクトリを除いたファイルのみを対象とします。
Get-ChildItem -File [パス]
もしディレクトリを対象としたい場合は-Directoryをつけます。
Get-ChildItem -Directory [パス]
ただ、上記のコマンドでは指定したパスの直下にあるディレクトリ・ファイルしか取得できません。
-Recurseオプションをつけることでサブディレクトリの中身まで検索対象にできます。
Get-ChildItem -Recurse [パス]
配下にあるすべてのディレクトリ・ファイルを取得できるだけでは融通がききません。
-Includeオプションをつけて特定の条件に合致するファイル名を持つファイルを取得できるようにします。
Get-ChildItem -Recuse -Include ._* [パス]
-Includeの後に._*を記載することで._で始まるファイル名を持つファイルを対象にしています。
*はワイルドカードで任意の文字列を指します。
つまり、何でもよくすべての文字列を指しています。
._と*をつなげることで._[任意の文字列]を指したことになり、._から始まるファイル名を持つすべてのファイルを指定したことになります。
この-Includeで使用できるワイルドカードは4つあります。
- * 任意の0文字以上の文字列
- ? 任意の1文字
- [] 角かっこ内の1文字
- [] 角かっこ内の記載された範囲内の1文字
ついでながら-Includeは-Recurseを指定しなければ機能しませんので注意してください。
続いて、-Forceオプションを使います。
Windowsのディレクトリには隠しファイルがありますが、上記までのコマンドでは隠しファイルを抽出できません。
そのため-Forceをつけて隠しファイルも検索対象とします。
Get-ChildItem -Force [パス]
以上を踏まえてコマンドを下記にしています。
Get-ChildItem -File -Path D:/test -Recurse -Include ._* -Force
D:¥test配下およびそのサブディレクトリ配下にある._から始まる隠しファイルを含めたファイルを取得しています。
Remove-Itemでディレクトリ・ファイルを削除する
Remove-Itemコマンドはディレクトリ・ファイルを削除するためのコマンドです。
Remove-Item -Recurse -Force
-RecurseオプションはGet-ChildItemの時と同様でディレクトリ配下のサブディレクトリ内まで対象にするオプションです。
ディレクトリを削除対象とするときには必要ですが、ファイルを削除対象とする場合には不要です。
-ForceオプションもGet-ChildItemの時と同様で隠しファイルも対象としたい場合に使います。
今回はRemove-Itemの前にパイプでGet-ChildItemを繋いでいるため、Get-ChildItemで取得したディレクトリ・ファイルを削除します。
終わりに
上記、ディレクトリ・ファイルを一括削除する方法でした。
今回はGet-ChildItemでディレクトリ・ファイルを取得してRemove-Itemで削除しましたが、Remove-Itemだけでもディレクトリ・ファイルを絞り込めます。
Remove-Itemを直で使うと間違ったものを取得していても削除してしまうため、Get-ChildItemを先に使用し対象を把握したうえでRemove-Itemで削除しました。
他にもやり方はたくさんありますので良い方法を選択してください。

