Powershell setara dengan `grep -r -l` (--files-with-cocok)

45

Di Powershell, bagaimana cara membuat daftar semua file dalam direktori (secara rekursif) yang berisi teks yang cocok dengan regex yang diberikan? File-file yang dimaksud berisi baris yang sangat panjang dari teks yang tidak dapat dipahami, jadi saya tidak ingin melihat baris yang cocok - hanya nama file.

Michael Kropat
sumber

Jawaban:

57

Anda dapat menggunakan Select-Stringuntuk mencari teks di dalam file, dan Select-Objectuntuk mengembalikan properti spesifik untuk setiap kecocokan. Sesuatu seperti ini:

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

Atau versi yang lebih pendek, menggunakan alias:

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

Jika Anda hanya menginginkan nama file, bukan path lengkap, ganti Pathdengan Filename.


Penjelasan:

  1. Get-ChildItem-Recurse *.* mengembalikan semua file dalam direktori saat ini dan semua subdirektori.

  2. Select-String-Pattern "foobar" mencari file-file itu untuk pola yang diberikan "foobar".

  3. Select-Object-Unique Pathhanya mengembalikan jalur file untuk setiap kecocokan; yang -Uniqueparameter menghilangkan duplikat.

Indrek
sumber
select -Unique... keren, belajar sesuatu yang baru. Itu bekerja dengan sempurna, terima kasih!
Michael Kropat
Apakah . sangat dibutuhkan? Dapatkan-ChildItem -Recurse bekerja persis sama saya pikir.
Piotr Perak
1
atau bahkan lebih ringkas, gci -r | sls "foobar" | pilih jalur unik
David Markle
Jika tidak ada kecocokan, PowerShell tampaknya "hang", itu tidak akan kembali. Bagaimana cara mengetahui saat pencarian dilakukan jika tidak ada yang cocok?
reggaeguitar
2

Perhatikan, bahwa dalam powershell v1.0 dan v2.0 Anda perlu menentukan parameter posisi pertama (jalur) untuk bekerja dengannya -Recursion

dokumentasi teknik

-Kembali

Mendapat item di lokasi yang ditentukan dan di semua item anak dari lokasi.

Di Windows PowerShell 2.0 dan versi Windows PowerShell sebelumnya, parameter Perulangan hanya berfungsi ketika nilai parameter Path adalah sebuah wadah yang memiliki item anak, seperti C: \ Windows atau C: \ Windows *, dan bukan ketika itu adalah item tidak memiliki item turunan, seperti C: \ Windows * .exe.

Vladislav
sumber
0

Select-String memiliki -Listparameter untuk tujuan ini:

Hanya kembalikan kecocokan pertama di setiap file input. Secara default, Select-String mengembalikan objek MatchInfo untuk setiap kecocokan yang ditemukan.

- ss64.com

Anda bisa menggunakannya seperti ini:

gci -Recurse | sls -List FOOBAR

Berikut ini beberapa contoh hasil (mencari SDK Windows 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)

Jika Anda ingin mendapatkan kembali FileInfoobjek yang sebenarnya (bukan Path relatif dan hasil pertandingan tunggal), Anda dapat menggunakannya seperti ini:

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