web-dev-qa-db-ja.com

PowerShellを使用して、正規表現に一致するフォルダー内のファイルを削除するにはどうすればよいですか?

私は、私のWindowsコンピュータ上の多くの不要なファイルのファイル名の共通の特徴を知っています。単一の 正規表現 PowerShellコマンドを使用して、特定のフォルダーまたはフォルダー階層からこれらのファイルをすべて削除するにはどうすればよいですか?

24
Techrocket9

Get-ChildItemコマンドを、RegExパターンを受け入れるWhere-Objectフィルターを介してパイプ処理し、それをRemove-Itemにパイプ処理できます。 Select-Stringを使用するよりも速く、より良い結果が得られると思います。次のようなコマンドで:

Get-ChildItem $Path | Where{$_.Name -Match "<RegEx Pattern>"} | Remove-Item

Name属性は、ファイルの拡張子とともに、ファイルまたはフォルダーの名前とのみ一致します。パスに沿った他のものとは一致しません。これにより、パイプを介してFileInfoオブジェクトが渡されます。このパイプは、Remove-Itemがパイプ入力として受け取り、問題のファイルを削除します。

パスのサブフォルダーを含める場合は、-RecurseスイッチをGet-ChildItemコマンドに追加すると、次のようになります。

Get-ChildItem $Path -Recurse | Where{$_.Name -Match "<RegEx Pattern>"} | Remove-Item

ファイルのみを削除する場合は、FileInfoオブジェクトのPSIsContainerプロパティを確認し、次のような感嘆符をオブジェクトの前に付けることでそれを反転することにより、Whereステートメントでそれを指定できます。

Get-ChildItem $Path -Recurse | Where{$_.Name -Match "<RegEx Pattern>" -and !$_.PSIsContainer} | Remove-Item
39

次のコマンドを使用できます。

ls -name | select-string -pattern ".*\(\d+\).*" | %{rm $_}

引用符の内容は正規表現です。この例の正規表現は、ファイル名に(#)が含まれるファイルを検索します。#は負でない整数です。これは、ミュージックマネージャなどによって、同じファイルのセットが何度もダンプされたフォルダ内の重複を削除する場合に役立ちます。

-nameの後に-rを追加した場合

ls -name -r | select-string -pattern ".*\(\d+\).*" | %{rm $_}

サブフォルダを再帰し、すべてのサブフォルダ内の一致するファイルを削除します。

コマンドの構造は次のとおりです。

  • lsは、Powershellコマンドget-childitemのエイリアスです。現在のフォルダ内のすべての要素が一覧表示されます。 -name引数は、名前のみが生成されることを指定します。ファイルサイズなど、他の情報は必要ありません。
  • select-stringは、パターン(正規表現)を行で区切られた一連の文字列に一致させるUNIX grepとほとんど同じです。 -patternパラメーターは、正規表現を使用するようにコマンドレットを設定します。
  • %{rm $ }はforeachループです。「この場合、select-stringから)私にパイプラインで送られる各行に対して」、次のアクションを実行します。ここで、$は指定された行です。この場合、アイテムをrm-ingしています。rmはRemove-Itemのエイリアスです。
4
Techrocket9

私はこれを使います:

(Get-ChildItem -Path $Path | Select -ExpandProperty Fullname) -match <regex> | Remove-Item
(Get-ChildItem -Path $Path -Recurse | Select -ExpandProperty Fullname) -match <regex> | Remove-Item

または、V3以降を使用していて、自動メンバー列挙がある場合:

 (Get-ChildItem -Path $Path).Fullname -match <regex> | Remove-Item
 (Get-ChildItem -Path $Path -Recurse).Fullname -match <regex> | Remove-Item

名前は、現在の作業ディレクトリがファイルを削除するディレクトリであり、すべてのファイルがそのディレクトリにある場合にのみ機能します(再帰により、同じ名前でパスが異なる複数のファイルが見つかる場合があります)。

2
mjolinor