Потужність еквівалента `grep -r -l` (--files-with-match)


44

Як я можу перерахувати всі файли в каталозі (рекурсивно) у Powershell, що містить текст, який відповідає заданому регулярному вираженню? Файли, про які йдеться, містять дійсно довгі рядки незрозумілого тексту, тому я не хочу бачити відповідний рядок - лише ім'я файлу.

Відповіді:


56

Ви можете використовувати Select-Stringдля пошуку тексту всередині файлів та Select-Objectдля повернення певних властивостей для кожної відповідності. Щось на зразок цього:

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

Або більш коротка версія, використовуючи псевдоніми:

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

Якщо ви хочете лише імена файлів, а не повні шляхи, замініть Pathна Filename.


Пояснення:

  1. Get-ChildItem-Recurse *.* повертає всі файли в поточному каталозі та всі його підкаталоги.

  2. Select-String-Pattern "foobar" здійснює пошук цих файлів за заданим шаблоном "foobar".

  3. Select-Object-Unique Pathповертає лише шлях до файлу для кожного матчу; -Uniqueпараметр усуває дублікати.


select -Unique... круто, дізнався щось нове. Це прекрасно працює, дякую!
Михайло Кропат

Є чи . справді потрібні? Get-ChildItem -Recurse працює точно так само, як я думаю.
Пьотр Перак

1
або навіть більш стисло, gci -r | sls "foobar" | select -unique path
Девід

Якщо немає відповідностей, схоже, що PowerShell "висить", він не повернеться. Як дізнатися, коли здійснюється пошук, якщо немає відповідностей?
reggaeguitar

2

Зауважте, що в powershell v1.0 та v2.0 вам потрібно вказати параметр першого положення (шлях), з яким потрібно працювати -Recursion

документація з технічної мережі

-Рекурс

Отримує елементи у вказаних місцях та в усіх дочірніх елементах цих місць.

У Windows PowerShell 2.0 та більш ранніх версіях Windows PowerShell параметр Recurse працює лише тоді, коли значення параметра Path є контейнером, у якому є дочірні елементи, такі як C: \ Windows або C: \ Windows *, а не тоді, коли це елемент не містить дочірніх елементів, таких як C: \ Windows * .exe.


1

Використовуйте нижченаведену команду всередині каталогу, в якому ви хочете виконати "grep" та змінити так, [SEARCH_PATTERN]щоб відповідати тому, що ви хочете відповідати. Це рекурсивно, шукаючи всі файли в каталозі.

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

http://www.jamescoyle.net/how-to/1205-how-to-use-powershell-to-recursively-search-for-text-within-files-on-windows


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 }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.