如何使用PowerShell删除与正则表达式匹配的文件夹中的文件?

时间:2014-05-20 18:38:46

标签: regex windows file powershell file-io

我知道Windows计算机上许多不需要的文件的文件名的共同特征。如何使用单个regular expression PowerShell命令从给定的文件夹或文件夹层次结构中删除所有这些文件?

3 个答案:

答案 0 :(得分:35)

您可以通过接受RegEx模式的Where-Object过滤器管道Get-ChildItem命令,然后将其传递到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

如果您只想删除文件,可以在Where语句中指定,方法是查看FileInfo对象的PSIsContainer属性,并通过在对象前添加一个感叹号来反转它:

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

答案 1 :(得分:4)

您可以使用命令

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,它将模式(regex)与一堆行分隔的字符串相匹配。 -pattern参数将cmdlet设置为采用正则表达式。
  • %{rm $ }是一个foreach循环。它是说,&#34;对于管道输入我的每一行(在这种情况下来自select-string)&#34;,执行以下操作,其中$ 是给定的行。在这种情况下,我们正在使用项目,其中rm是Remove-Item的别名。

答案 2 :(得分:2)

我用这个:

(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

如果您当前的工作目录是您要删除文件的目录,并且所有文件都在该目录中,则名称才能生效(递归可能会找到多个具有相同名称的文件,但是不同的路径)。