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.
Réponses
Trop de publicités?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 :
-
Get-ChildItem
-Recurse *.*
retourne tous les fichiers du répertoire courant et de tous ses sous-répertoires. -
Select-String
-Pattern "foobar"
recherche ces fichiers pour le motif donné "foobar". -
Select-Object
-Unique Path
ne renvoie que le chemin d'accès au fichier pour chaque correspondance ; la commande-Unique
élimine les doublons.
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
-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.
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]
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 }