Equilíbrio de Powershell de 'grep -r -l' (--files-with-matches)

42

No Powershell, como faço para listar todos os arquivos em um diretório (recursivamente) que contenham texto que corresponda a um determinado regex? Os arquivos em questão contêm linhas realmente longas de texto incompreensível, então não quero ver a linha correspondente - apenas o nome do arquivo.

    
por Michael Kropat 15.04.2014 / 20:35

4 respostas

53

Você pode usar Select-String para pesquisar texto dentro de arquivos e Select-Object para retornar propriedades específicas para cada correspondência. Algo assim:

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

Ou uma versão mais curta, usando aliases:

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

Se você quiser apenas os nomes dos arquivos, não os caminhos completos, substitua Path por Filename .

Explicação:

  1. Get-ChildItem -Recurse *.* retorna todos os arquivos no diretório atual e todos os seus subdiretórios.

  2. Select-String -Pattern "foobar" pesquisa esses arquivos para o padrão fornecido " foobar ".

  3. Select-Object -Unique Path retorna apenas o caminho do arquivo para cada correspondência ; o parâmetro -Unique elimina duplicados.

por 15.04.2014 / 20:48
2

Note que no powershell v1.0 e v2.0 você precisa especificar o primeiro parâmetro de posição (path) para trabalhar com -Recursion

documentação do technet

-Recurse

Gets the items in the specified locations and in all child items of the locations.

In Windows PowerShell 2.0 and earlier versions of Windows PowerShell, the Recurse parameter works only when the value of the Path parameter is a container that has child items, such as C:\Windows or C:\Windows*, and not when it is an item does not have child items, such as C:\Windows*.exe.

    
por 28.08.2015 / 15:41
0

Use o comando abaixo dentro do diretório que você gostaria de executar o "grep" e altere [SEARCH_PATTERN] para corresponder ao que você gostaria de igualar. É recursivo, pesquisando todos os arquivos no diretório.

dir -Recurse | Select-String - pattern [SEARCH_PATTERN]

link

    
por 06.03.2016 / 01:11
0

Select-String tem% co_de parâmetro% para este propósito:

Return only the first match in each input file. By default, Select-String returns a MatchInfo object for each match found.

- ss64.com

Você pode usá-lo assim:

gci -Recurse | sls -List FOOBAR

Veja como alguns resultados de amostra se parecem (pesquisando o SDK do Windows em -List ):

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)

Se você quiser recuperar os objetos ERROR_SUCCESS reais (em vez do caminho relativo e de um único resultado de correspondência), use-o da seguinte forma:

Get-ChildItem -Recurse -File | where { Select-String -Path $_ -List -Pattern FOOBAR }
    
por 08.01.2017 / 16:11