Equivalente Powershell di `grep -r -l` (--files-with-match)


45

In Powershell, come posso elencare tutti i file in una directory (ricorsivamente) che contengono testo che corrisponde a una data regex? I file in questione contengono righe davvero lunghe di testo incomprensibile, quindi non voglio vedere la riga corrispondente, ma solo il nome del file.

Risposte:


57

È possibile utilizzare Select-Stringper cercare testo all'interno dei file e Select-Objectper restituire proprietà specifiche per ogni corrispondenza. Qualcosa come questo:

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

O una versione più breve, usando gli alias:

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

Se vuoi solo i nomi dei file, non i percorsi completi, sostituiscili Pathcon Filename.


Spiegazione:

  1. Get-ChildItem-Recurse *.* restituisce tutti i file nella directory corrente e tutte le sue sottodirectory.

  2. Select-String-Pattern "foobar" cerca quei file per il modello dato "foobar".

  3. Select-Object-Unique Pathrestituisce solo il percorso del file per ogni corrispondenza; il -Uniqueparametro elimina i duplicati.


select -Unique... fantastico, ho imparato qualcosa di nuovo. Funziona perfettamente, grazie!
Michael Kropat,

Lo è . veramente necessario? Get-ChildItem -Recurse funziona esattamente come penso.
Piotr Perak,

1
o ancora più concisamente, gci -r | sls "foobar" | seleziona -unique path
David Markle

Se non ci sono corrispondenze, PowerShell sembra "bloccarsi", non ritorna. Come si fa a sapere quando viene eseguita la ricerca se non ci sono corrispondenze?
reggaeguitar,

2

Si noti che in PowerShell v1.0 e v2.0 è necessario specificare il primo parametro di posizione (percorso) con cui lavorare -Recursion

documentazione tecnica

-Ricorso

Ottiene gli articoli nelle posizioni specificate e in tutti gli elementi figlio delle posizioni.

In Windows PowerShell 2.0 e versioni precedenti di Windows PowerShell, il parametro Recurse funziona solo quando il valore del parametro Path è un contenitore con elementi figlio, come C: \ Windows o C: \ Windows *, e non quando è un l'elemento non ha elementi figlio, come C: \ Windows * .exe.



0

Select-String ha un -Listparametro per questo scopo:

Restituisce solo la prima corrispondenza in ciascun file di input. Per impostazione predefinita, Select-String restituisce un oggetto MatchInfo per ogni corrispondenza trovata.

- ss64.com

Puoi usarlo in questo modo:

gci -Recurse | sls -List FOOBAR

Ecco come appaiono alcuni risultati di esempio (cercando 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)

Se si desidera recuperare gli FileInfooggetti reali (anziché il relativo percorso e un singolo risultato della corrispondenza), è possibile utilizzarlo in questo modo:

Get-ChildItem -Recurse -File | where { Select-String -Path $_ -List -Pattern FOOBAR }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.