【发布时间】:2014-07-09 04:03:22
【问题描述】:
我知道我的 Windows 计算机上许多不需要的文件的文件名的共同特征。如何使用单个 regular expression PowerShell 命令从给定文件夹或文件夹层次结构中删除所有这些文件?
【问题讨论】:
标签: regex windows file powershell file-io
我知道我的 Windows 计算机上许多不需要的文件的文件名的共同特征。如何使用单个 regular expression PowerShell 命令从给定文件夹或文件夹层次结构中删除所有这些文件?
【问题讨论】:
标签: regex windows file powershell file-io
我会用这个:
(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
仅当您当前的工作目录是您要从中删除文件的目录并且所有文件都在该目录中时,名称才会起作用(递归可能会找到多个具有相同名称但路径不同的文件)。
【讨论】:
您可以将 Get-ChildItem 命令通过接受 RegEx 模式的 Where-Object 过滤器进行管道传输,然后将其管道传输到 Remove-Item。我认为这会让你获得比使用 Select-String 更快、更好的结果。使用如下命令:
Get-ChildItem $Path | Where{$_.Name -Match "<RegEx Pattern>"} | Remove-Item
Name 属性只会匹配文件或文件夹的名称以及文件的扩展名。它不会与路径上的其他事物匹配。这将通过管道传递一个 FileInfo 对象,Remove-Item 将其作为管道输入并删除有问题的文件。
如果您想包含路径的子文件夹,您可以在 Get-ChildItem 命令中添加 -Recurse 开关,它看起来像这样:
Get-ChildItem $Path -Recurse | Where{$_.Name -Match "<RegEx Pattern>"} | Remove-Item
如果您只想删除文件,您可以在 Where 语句中指定,方法是查看 FileInfo 对象的 PSIContainer 属性并通过在对象前面加上感叹号来反转它:
Get-ChildItem $Path -Recurse | Where{$_.Name -Match "<RegEx Pattern>" -and !$_.PSIsContainer} | Remove-Item
【讨论】:
Get-ChildItem 默认不检索隐藏文件。可以使用-Force 或-Attributes 更改此行为:technet.microsoft.com/en-us/library/hh847897.aspx
你可以使用命令,
ls -name | select-string -pattern ".*\(\d+\).*" | %{rm $_}
引号的内容是你的正则表达式。此示例中的正则表达式搜索文件名中包含 (#) 的文件,其中 # 是任何非负整数。这对于删除同一组文件被多次转储的文件夹中的重复项非常有用,例如由音乐管理器转储。
如果你在 -name 之后添加 -r
ls -name -r | select-string -pattern ".*\(\d+\).*" | %{rm $_}
它将遍历子文件夹并删除所有子文件夹中的匹配文件。
命令结构如下:
【讨论】:
-name 参数仅输出字符串,因此您会丢失所有其他文件元数据(Length、LastWriteTime 等)。我建议改为匹配 Name 属性(如 mjolinor 建议的那样使用 -match)。