列出与模式匹配的文件夹中的文件名,不包括文件内容

问题描述 投票:13回答:3

我使用下面的方法递归列出包含$pattern的文件夹中的所有文件

Get-ChildItem $targetDir -recurse | Select-String -pattern "$pattern" | group path | select name

但似乎它列出了在其名称和内容中具有$pattern的文件,例如当我运行上面的$pattern="SAMPLE"我得到:

C:\tmp\config.include
C:\tmp\README.md
C:\tmp\specs\SAMPLE.data.nuspec
C:\tmp\specs\SAMPLE.Connection.nuspec

现在:

C:\tmp\config.include
C:\tmp\README.md

确实包含SAMPLE关键字/文本,但我不关心,我只需要命令列出文件名而不是文件,其内容与模式匹配。我错过了什么?

基于以下答案,我也尝试过:

$targetDir="C:\tmp\"
Get-ChildItem $targetDir -recurse | where {$_.name -like "SAMPLE"} | group path | select name

和:

$targetDir="C:\tmp\"
Get-ChildItem $targetDir -recurse | where {$_.name -like "SAMPLE"} | select name

但它不会返回任何结果。

powershell powershell-v5.0
3个回答
25
投票

Select-String正在做你告诉它的事情。强调我的。

Select-String cmdlet在输入字符串和文件中搜索文本和文本模式。

因此,如果您只是想与文件名匹配,请使用-FilterGet-ChildItem或使用Where-Object发布流程

Get-ChildItem -Path $path -Recurse -Filter "*sample*"

这应该返回名称中包含样本的所有文件和文件夹。如果您只是想要文件或目录,则可以使用开关-File-Directory来返回这些特定的对象类型。

如果你的模式比一个简单的单词更复杂,那么你可能需要像Where-Object一样使用Itchydon's answer,使用像-match这样的东西,让你可以访问正则表达式。


代码中的分组逻辑应该是冗余的,因为您要返回所有具有唯一路径的单个文件。因此我没有在这里包括。如果你只是想要路径那么你可以管道进入Select-Object -Expand FullName或只是(Get-ChildItem -Path $path -Recurse -Filter "*sample*").Fullname


6
投票

补充Matt's helpful answer

具体来说,因为你对Select-String的管道是[System.IO.FileInfo]对象 - 这是Get-ChildItem输出的 - 而不是字符串,它是搜索这些对象所代表的文件的内容。

假设您只需要匹配每个文件路径的文件名部分,并且您的模式可以表示为通配符表达式,那么您根本不需要Select-String,而是可以使用Get-ChildItem-Filter,如Matt的答案,或者更慢,但更强大的-Include

警告:

  • Select-String -Pattern接受正则表达式(例如,.*sample.*;参见Get-Help about_Regular_Expressions),
  • Get-ChildItem -Filter/-Include接受通配符表达式(例如,*sample*;参见Get-Help about_Wildcards) - 它们是不同的东西。

请注意:如果您的目的是仅匹配文件,您可以告诉Get-ChildItem使用-File限制输出到文件(而不是可能也是目录)(类似地,您可以使用-Directory限制输出到目录)。


Group-Object pathgroup path)将不会按预期工作,因为.Path输出的匹配信息对象的Select-String属性包含完整的文件名,因此您将把每个文件放在它自己的组中 - 基本上是一个无操作。

当只使用Get-ChildItem时,等效的属性名称将是.FullName,但是你要找的是按父路径(包含目录的路径),.DirectoryName分组,我猜想,因此:

... | Group-Object DirectoryName | Select-Object Name

这将输出每个目录的完整路径,该目录包含至少1个具有匹配文件名的文件。 (请注意,Name中的Select-Object Name指的是.Name返回的组对象的Group-Object属性,在这种情况下,它是输入对象上.DirectoryName属性的值。)


3
投票
get-ChildItem $targetDir -recurse | where {$_.name -like $pattern} | select name
© www.soinside.com 2019 - 2024. All rights reserved.