相当于grep -r -l(--files-with-matches)的Powershell


44

在Powershell中,如何(递归)列出目录中包含与给定正则表达式匹配的文本的所有文件?有问题的文件包含很长的难以理解的文本行,因此我不想看到匹配的行-只是文件名。

Answers:


56

您可以Select-String用来搜索文件中的文本,并Select-Object为每个匹配项返回特定的属性。像这样:

Get-ChildItem -Recurse *.* | Select-String -Pattern "foobar" | Select-Object -Unique Path

或更短的版本,使用别名:

dir -recurse *.* | sls -pattern "foobar" | select -unique path

如果只需要文件名而不是完整路径,请替换PathFilename


说明:

  1. Get-ChildItem-Recurse *.* 返回当前目录及其所有子目录中的所有文件。

  2. Select-String-Pattern "foobar" 在这些文件中搜索给定的模式“ foobar”。

  3. Select-Object-Unique Path仅返回每次匹配的文件路径;该-Unique参数消除重复项。


select -Unique...很酷,学到了一些新东西。很好,谢谢!
Michael Kropat 2014年

真的需要吗?Get-ChildItem -Recurse的工作原理与我想的完全相同。
霹雳州霹雳州

1
甚至更简而言之,gci -r | sls“ foobar” | 选择-unique路径
David Markle

如果没有匹配项,PowerShell似乎会“挂起”,则不会返回。如果没有匹配项,如何知道何时进行搜索?
reggaeguitar

2

请注意,在Powershell v1.0和v2.0中,您需要指定第一个位置参数(路径)才能使用 -Recursion

technet文档

-递归

获取指定位置及其所有子项中的项目。

在Windows PowerShell 2.0和Windows PowerShell的早期版本中,仅当Path参数的值是具有子项(例如C:\ Windows或C:\ Windows *)的容器时,Recurse参数才有效,而当它是item没有子项目,例如C:\ Windows * .exe。



0

Select-String具有-List用于此目的的参数:

仅返回每个输入文件中的第一个匹配项。默认情况下,Select-String为找到的每个匹配项返回MatchInfo对象。

ss64.com

您可以像这样使用它:

gci -Recurse | sls -List FOOBAR

以下是一些示例结果的样子(在Windows SDK中搜索ERROR_SUCCESS):

shared\bthdef.h:576:#define BTH_ERROR(_btStatus)   ((_btStatus) != BTH_ERROR_SUCCESS)
shared\netioapi.h:2254:    ERROR_SUCCESS on success.  WIN32 error code on error.
shared\rpcnterr.h:34:#define RPC_S_OK                          ERROR_SUCCESS
shared\winerror.h:214:// MessageId: ERROR_SUCCESS
um\advpub.h:40://      ERROR_SUCCESS_REBOOT_REQUIRED        Reboot required.
um\bluetoothapis.h:243://      ERROR_SUCCESS
um\ClusApi.h:571:_Success_(return == ERROR_SUCCESS)
um\dsparse.h:102:_Success_(return == ERROR_SUCCESS)
um\eapmethodpeerapis.h:228:// If the function succeeds, it returns ERROR_SUCCESS. Otherwise, it is
um\eappapis.h:56:// If the functions succeed, they return ERROR_SUCCESS. Otherwise, it is
um\MapiUnicodeHelp.h:583:                if ((hkeyPolicy && RegQueryValueExW(hkeyPolicy, szName, 0, &dwType, (LPBYTE)
&dwLcid, &dwSize) == ERROR_SUCCESS && dwType == REG_DWORD) ||
um\Mddefw.h:127:            routine will return ERROR_SUCCESS and the inherited data even if
um\Msi.h:1693:// Returns ERROR_SUCCESS if file is a package.
um\MsiQuery.h:192:// Returns ERROR_SUCCESS if successful, and the view handle is returned,
um\msports.h:46:    ERROR_SUCCESS if the dialog was shown
um\ncryptprotect.h:164:    ERROR_SUCCESS
um\NTMSAPI.h:1761:_Success_ (return == ERROR_SUCCESS)
um\oemupgex.h:108://  Returns:    ERROR_SUCCESS in case of success, win32 error otherwise
um\PatchWiz.h:90://                     ERROR_SUCCESS, plus ERROR_PCW_* that are listed in constants.h.
um\Pdh.h:415:_Success_(return == ERROR_SUCCESS)

如果要获取实际FileInfo对象(而不是相对路径和单个匹配结果),则可以这样使用它:

Get-ChildItem -Recurse -File | where { Select-String -Path $_ -List -Pattern FOOBAR }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.