Powershell эквивалентный `grep -r -l` (--files-with-match)

45

В Powershell, как мне перечислить все файлы в каталоге (рекурсивно), которые содержат текст, соответствующий заданному регулярному выражению? Эти файлы содержат действительно длинные строки непонятного текста, поэтому я не хочу видеть совпадающую строку - только имя файла.

Майкл Кропат
источник

Ответы:

57

Вы можете использовать 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" | выберите уникальный путь
Дэвид Маркл
Если совпадений нет, PowerShell «зависает», он не вернется. Как узнать, когда поиск будет выполнен, если нет совпадений?
reggaeguitar
2

Обратите внимание, что в powershell v1.0 и v2.0 необходимо указать первый параметр позиции (путь) для работы с -Recursion

техническая документация

-Recurse

Получает элементы в указанных местоположениях и во всех дочерних элементах местоположений.

В 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

JAC2703
источник
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 }
Майкл Кропат
источник