58 votes

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

En Powershell, comment puis-je lister tous les fichiers d'un répertoire (de manière récursive) qui contiennent du texte correspondant à une regex donnée ? Les fichiers en question contiennent de très longues lignes de texte incompréhensible, je ne veux donc pas voir la ligne correspondante, mais seulement le nom du fichier.

74voto

Indrek Points 23336

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

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

Ou une version plus courte, en utilisant des pseudonymes :

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

Si vous voulez juste les noms de fichiers, pas les chemins complets, remplacez Path con Filename .


Explication :

  1. Get-ChildItem-Recurse *.* retourne tous les fichiers du répertoire courant et de tous ses sous-répertoires.

  2. Select-String-Pattern "foobar" recherche ces fichiers pour le motif donné "foobar".

  3. Select-Object-Unique Path ne renvoie que le chemin d'accès au fichier pour chaque correspondance ; la commande -Unique élimine les doublons.

2voto

Vladislav Points 21

Notez que dans powershell v1.0 et v2.0, vous devez spécifier le paramètre de première position (path) pour travailler avec les éléments suivants -Recursion

documentation technet

-Recours

Obtient les éléments dans les emplacements spécifiés et dans tous les éléments enfants de ces 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 le paramètre Path est un conteneur qui possède des éléments enfants, tels que C:\Windows o C:\Windows *, et non lorsqu'il s'agit d'un élément n'a pas d'éléments enfants, comme C:\Windows *.exe.

2voto

JAC2703 Points 129

Utilisez la commande suivante à l'intérieur du répertoire dans lequel vous souhaitez effectuer le "grep" et le modifier [SEARCH_PATTERN] pour correspondre à ce que vous souhaitez faire correspondre. Il est récursif et recherche dans 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

1voto

Michael Kropat Points 855

Select-String a un -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 quelques exemples de résultats (recherche dans le SDK Windows de 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)

Si vous vouliez récupérer l'actuel FileInfo (au lieu du chemin d'accès relatif et d'un seul résultat de correspondance), vous pouvez l'utiliser comme suit :

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X