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

u12*_*123 22 powershell powershell-5.0

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

Get-ChildItem $targetDir -recurse | Select-String -pattern "$pattern" | group path | select name
Run Code Online (Sandbox Code Playgroud)

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

C:\tmp\config.include
C:\tmp\README.md
C:\tmp\specs\SAMPLE.data.nuspec
C:\tmp\specs\SAMPLE.Connection.nuspec
Run Code Online (Sandbox Code Playgroud)

现在:

C:\tmp\config.include
C:\tmp\README.md
Run Code Online (Sandbox Code Playgroud)

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

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

$targetDir="C:\tmp\"
Get-ChildItem $targetDir -recurse | where {$_.name -like "SAMPLE"} | group path | select name
Run Code Online (Sandbox Code Playgroud)

和:

$targetDir="C:\tmp\"
Get-ChildItem $targetDir -recurse | where {$_.name -like "SAMPLE"} | select name
Run Code Online (Sandbox Code Playgroud)

但它不会返回任何结果.

Mat*_*att 35

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

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

所以,如果你只是寻找到匹配文件名只需要使用-FilterGet-ChildItem或后处理与Where-Object

Get-ChildItem -Path $path -Recurse -Filter "*sample*"
Run Code Online (Sandbox Code Playgroud)

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

如果你的模式比简单的单词更复杂,那么你可能需要Where-ObjectItchydon的答案中使用类似于-match让你访问正则表达式的东西.


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

  • 对于Get-ChildItem,您可以使用快捷方式“ gci” (2认同)
  • @devi您可以使用快捷方式,但我建议您不要这样做,因为它会降低可读性。特别适合那些对Powershell经验不足的人。 (2认同)

mkl*_*nt0 7

为了补充 马特的有用的答案:

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

假设你只需要匹配文件名,每个文件的路径和您的模式可以表示为一个部分通配符表达式,你并不需要Select-String在所有的,可以改为使用Get-ChildItem-Filter在马特的答案,因为,或慢,但稍更强大-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 path(group path)将不会按预期工作,因为.Path输出的匹配信息对象的属性Select-String包含完整的文件名,因此您将把每个文件放在它自己的组中 - 基本上是一个无操作.

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

... | Group-Object DirectoryName | Select-Object Name
Run Code Online (Sandbox Code Playgroud)

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


Itc*_*don 5

get-ChildItem $targetDir -recurse | where {$_.name -like $pattern} | select name
Run Code Online (Sandbox Code Playgroud)

  • 我没有正确阅读标题,而您却阅读了。我会在这里包括_why_您的代码是正确的解决方案。在某些情况下,仅粘贴没有上下文的代码是没有帮助的。“选择字符串”正在搜索文件_contents._。您也可以根据模式的性质使用Get-ChildItem的-Filter,并跳过where。由于这些对象没有路径属性,因此也应删除此处的“组”。。 (3认同)
  • 当人们得到有关添加解释的有用建议并且得到的答复是“哦,是的,谢谢,下次我会这样做”时,这真的让我很烦恼。不,现在就做,这就是编辑按钮的用途 (3认同)