web-dev-qa-db-fra.com

Équivalent Powershell de `grep -r -l` (--files-with-matches)

Dans Powershell, comment répertorier (de manière récursive) tous les fichiers d'un répertoire contenant du texte correspondant à une expression régulière donnée? Les fichiers en question contiennent de très longues lignes de texte incompréhensible. Je ne souhaite donc pas voir la ligne correspondante, mais uniquement le nom du fichier.

42
Michael Kropat

Vous pouvez utiliser Select-String pour rechercher du texte dans des fichiers et Select-Object pour renvoyer des propriétés spécifiques pour chaque correspondance. Quelque chose comme ça:

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

Ou une version plus courte, utilisant des alias:

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

Si vous voulez seulement les noms de fichiers, pas les chemins complets, remplacez Path par Filename.


Explication:

  1. Get-ChildItem-Recurse *.* renvoie tous les fichiers du répertoire en cours et tous ses sous-répertoires.

  2. Select-String-Pattern "foobar" recherche dans ces fichiers le motif "foobar".

  3. Select-Object-Unique Path renvoie uniquement le chemin du fichier pour chaque correspondance; Le paramètre -Unique élimine les doublons.

53
Indrek

Notez que, dans powershell v1.0 et v2.0, vous devez spécifier le premier paramètre de position (chemin) avec lequel travailler avec -Recursion

documentation technique

-Recours

Obtient les éléments dans les emplacements spécifiés et dans tous les éléments enfants des emplacements.

Dans Windows PowerShell 2.0 et les versions antérieures de Windows PowerShell, le paramètre Recurse ne fonctionne que lorsque la valeur du paramètre Path est un conteneur contenant des éléments enfants, tels que C:\Windows ou C:\Windows *, et non lorsqu'il s'agit d'un conteneur. L'élément n'a pas d'éléments enfants, tels que C:\Windows * .exe.

2
Vladislav

Select-String a un paramètre -List à cette fin:

Renvoie uniquement la première correspondance dans chaque fichier d'entrée. Par défaut, Select-String renvoie un objet MatchInfo pour chaque correspondance trouvée.

- ss64.com

Vous pouvez l'utiliser comme ceci:

gci -Recurse | sls -List FOOBAR

Voici à quoi ressemblent quelques exemples de résultats (recherche de ERROR_SUCCESS dans le SDK Windows):

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)

Si vous voulez récupérer les objets FileInfo actuels (au lieu du chemin relatif et d'un résultat de correspondance unique), vous pouvez l'utiliser comme ceci:

Get-ChildItem -Recurse -File | where { Select-String -Path $_ -List -Pattern FOOBAR }
0
Michael Kropat

Utilisez la commande ci-dessous dans le répertoire dans lequel vous souhaitez exécuter le "grep" et modifiez [SEARCH_PATTERN] pour correspondre à ce que vous souhaitez faire correspondre. C'est récursif, en parcourant tous les fichiers du répertoire.

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
JAC2703