Powershell `grep -r -l` (- - eşleşmeli) eşdeğeri


44

Powershell'de, belirli bir regex ile eşleşen metni içeren bir dizindeki (tekrarlı olarak) tüm dosyaları nasıl listeleyebilirim? Söz konusu dosyalar gerçekten çok uzun anlaşılmaz metin satırları içeriyor, bu nedenle eşleşen satırı görmek istemiyorum - sadece dosya adı.

Yanıtlar:


56

Sen kullanabilirsiniz Select-Stringdosyaları içinde metin aramak için, ve Select-Objecther maç için spesifik özelliklerini dönmek için. Bunun gibi bir şey:

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

Veya takma ad kullanarak daha kısa bir sürüm:

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

Sadece dosya değil, tam yollarını istiyorsanız, yerini Pathile Filename.


Açıklama:

  1. Get-ChildItem-Recurse *.* Geçerli dizindeki tüm dosyaları ve tüm alt dizinlerini döndürür.

  2. Select-String-Pattern "foobar" verilen dosyaları "foobar" için arar.

  3. Select-Object-Unique Pathher eşleşme için yalnızca dosya yolunu döndürür; -UniqueParametre çiftleri ortadan kaldırır.


select -Unique... harika, yeni bir şey öğrendim. Bu mükemmel çalışıyor, teşekkürler!
Michael Kropat

. Gerçekten gerekli mi? Get-ChildItem -Recurse tam olarak düşündüğüm gibi çalışıyor.
Piotr Perak

1
veya daha da öze, gci -r | sls "foobar" | benzersiz yolu seçin
David Markle,

Eşleşme yoksa PowerShell "takılıyor" gibi görünüyor, geri dönmeyecek. Eşleşme yoksa, aramanın ne zaman yapıldığını nasıl bilebilir?
reggaeguitar

2

Powershell v1.0 ve v2.0'da çalışmak için ilk konum parametresini (yol) belirtmeniz gerektiğini unutmayın -Recursion

teknik dokümantasyon

-recurse

Belirtilen konumlardaki ve konumların tüm alt öğelerindeki öğeleri alır.

Windows PowerShell 2.0 ve Windows PowerShell'in önceki sürümlerinde, Recurse parametresi yalnızca Path parametresinin değeri C: \ Windows veya C: \ Windows * gibi alt öğelere sahip bir kapsayıcı olduğunda ve bir öğenin C: \ Windows * .exe gibi alt öğeleri yoktur.



0

Select-String-List bu amaç için bir parametreye sahiptir :

Her girdi dosyasında yalnızca ilk eşleşmeyi döndür. Varsayılan olarak, Select-String bulunan her eşleşme için bir MatchInfo nesnesi döndürür.

- ss64.com

Bu şekilde kullanabilirsiniz:

gci -Recurse | sls -List FOOBAR

İşte bazı örnek sonuçların neye benzediği (Windows SDK’nın aranması 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)

Asıl FileInfonesneleri geri almak istiyorsanız (göreceli Yol ve tek bir eşleşme sonucu yerine), bunu şu şekilde kullanabilirsiniz:

Get-ChildItem -Recurse -File | where { Select-String -Path $_ -List -Pattern FOOBAR }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.