Odpowiednik programu PowerShell dla `grep -r -l` (--files-with-mecze)

44

W programie PowerShell, jak wyświetlić listę wszystkich plików w katalogu (rekurencyjnie), które zawierają tekst pasujący do podanego wyrażenia regularnego? Pliki, o których mowa, zawierają naprawdę długie linie niezrozumiałego tekstu, więc nie chcę widzieć pasującej linii - tylko nazwę pliku.

Michael Kropat
źródło

Odpowiedzi:

56

Możesz użyć Select-Stringdo wyszukiwania tekstu w plikach i Select-Objectdo zwracania określonych właściwości dla każdego dopasowania. Coś takiego:

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

Lub krótsza wersja, używając aliasów:

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

Jeśli chcesz tylko nazwy plików, a nie pełne ścieżki, wymienić Pathz Filename.


Wyjaśnienie:

  1. Get-ChildItem-Recurse *.* zwraca wszystkie pliki w bieżącym katalogu i wszystkich jego podkatalogach.

  2. Select-String-Pattern "foobar" przeszukuje te pliki pod kątem określonego wzorca „foobar”.

  3. Select-Object-Unique Pathzwraca tylko ścieżkę do pliku dla każdego dopasowania; -Uniqueparametr eliminuje duplikaty.

Indrek
źródło
select -Unique... spoko, nauczyłem się czegoś nowego. To działa idealnie, dzięki!
Michael Kropat
Jest . naprawdę potrzebny? Myślę, że Get-ChildItem -Recurse działa dokładnie tak samo.
Piotr Perak
1
lub jeszcze bardziej zwięźle, gci -r | sls "foobar" | wybierz-unikalną ścieżkę
David Markle
Jeśli nie ma żadnych dopasowań, PowerShell wydaje się „zawieszać”, nie powróci. Skąd wiadomo, kiedy wyszukiwanie jest wykonywane, jeśli nie ma żadnych dopasowań?
reggaeguitar
2

Zauważ, że w PowerShell v1.0 i v2.0 musisz określić parametr pierwszej pozycji (ścieżkę) do pracy -Recursion

dokumentacja technet

-Recurse

Pobiera elementy w określonych lokalizacjach i we wszystkich elementach podrzędnych lokalizacji.

W Windows PowerShell 2.0 i wcześniejszych wersjach Windows PowerShell parametr Recurse działa tylko wtedy, gdy wartość parametru Path jest kontenerem zawierającym elementy potomne, takie jak C: \ Windows lub C: \ Windows *, a nie gdy jest to element nie ma elementów potomnych, takich jak C: \ Windows * .exe.

Vladislav
źródło
0

Select-String ma w -Listtym celu parametr:

Zwraca tylko pierwsze dopasowanie w każdym pliku wejściowym. Domyślnie Select-String zwraca obiekt MatchInfo dla każdego znalezionego dopasowania.

- ss64.com

Możesz użyć tego w następujący sposób:

gci -Recurse | sls -List FOOBAR

Oto jak wyglądają niektóre przykładowe wyniki (wyszukiwanie zestawu 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)

Jeśli chcesz odzyskać rzeczywiste FileInfoobiekty (zamiast względnej ścieżki i pojedynczego wyniku dopasowania), możesz użyć tego w następujący sposób:

Get-ChildItem -Recurse -File | where { Select-String -Path $_ -List -Pattern FOOBAR }
Michael Kropat
źródło