我试图在Powershell中执行相当于linux命令find . | grep [search_string]
。
当我致电Get-ChildItem -recurse | Select-String [search_string]
时,它会匹配文件的内容,而不仅仅是我想要匹配的文件名。
如何只查看文件名?
答案 0 :(得分:2)
首先展开文件对象的Name
或FullName
属性:
Get-ChildItem -Recurse |
Select-Object -Expand FullName |
Select-String [search_string]
要获取匹配项的全名,请展开生成的Line
对象的MatchInfo
属性:
Get-ChildItem -Recurse |
Select-Object -Expand FullName |
Select-String [search_string] |
Select-Object -Expand Line
或使用Where-Object
过滤器代替Select-Object
:
Get-ChildItem -Recurse |
Select-Object -Expand FullName |
Where-Object { $_ -match [search_string] }
答案 1 :(得分:0)
更好的用法是使用Where-Object
cmdlet,然后只匹配文件名。
例如,假设您有一个这样的目录,并且您只想在名称中获取带有ham的文件。
Directory: T:\stack
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 4/5/2016 11:28 AM cat-1
d----- 4/5/2016 11:28 AM cat-2
d----- 4/5/2016 11:28 AM cat-3
d----- 4/5/2016 11:28 AM cat-4
d----- 4/5/2016 11:28 AM cat-5
d----- 4/5/2016 11:28 AM dog-1
d----- 4/5/2016 11:28 AM dog-2
d----- 4/5/2016 11:28 AM dog-3
使用此语法Dir | Where-Object Name -like *string*
,您可以轻松找到匹配的文件或文件夹:
dir | ? Name -like ham*
Directory: T:\stack
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 4/5/2016 11:28 AM ham-1
d----- 4/5/2016 11:28 AM ham-2
d----- 4/5/2016 11:28 AM ham-3
d----- 4/5/2016 11:28 AM ham-4
d----- 4/5/2016 11:28 AM ham-5
答案 2 :(得分:0)
易
function locate{
param(
[Parameter(Mandatory=$False,Position=2)]
[string] $loc = '.',
[Parameter(Mandatory=$True,Position=1)]
[string] $search
)
(gci $loc -Recurse).FullName | Select-String $search
}
PS C:\Users\username\Documents> locate somefile
C:\Users\username\Documents\somefile.csv
或
PS C:\Users\username\Documents> locate somefile ..
C:\Users\username\Documents\somefile.csv
C:\Users\username\Downloads\somefile.txt
C:\Users\username\Pictures\somefile.pst