Powershell tương đương với `grep -r -l` (--files-with-Match)


44

Trong Powershell, làm cách nào để liệt kê tất cả các tệp trong một thư mục (đệ quy) có chứa văn bản khớp với biểu thức chính quy? Các tệp trong câu hỏi chứa các dòng văn bản thực sự khó hiểu, vì vậy tôi không muốn xem dòng phù hợp - chỉ tên tệp.

Câu trả lời:


56

Bạn có thể sử dụng Select-Stringđể tìm kiếm văn bản bên trong các tệp và Select-Objectđể trả về các thuộc tính cụ thể cho từng trận đấu. Một cái gì đó như thế này:

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

Hoặc một phiên bản ngắn hơn, sử dụng bí danh:

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

Nếu bạn chỉ muốn tên tệp, không phải đường dẫn đầy đủ, thay thế Pathbằng Filename.


Giải trình:

  1. Get-ChildItem-Recurse *.* trả về tất cả các tệp trong thư mục hiện tại và tất cả các thư mục con của nó.

  2. Select-String-Pattern "foobar" tìm kiếm các tệp cho mẫu "foobar" đã cho.

  3. Select-Object-Unique Pathchỉ trả về đường dẫn tệp cho mỗi trận đấu; các -Uniquetham số loại bỏ các bản sao.


select -Unique... tuyệt, học được điều gì đó mới. Điều đó làm việc hoàn hảo, cảm ơn!
Michael Kropat

. thực sự cần thiết? Get-ChildItem -Recurse hoạt động chính xác như tôi nghĩ.
Piotr Perak

1
hoặc thậm chí chính xác hơn, gci -r | sls "foobar" | chọn đường dẫn -unique
David Markle

Nếu PowerShell không có kết quả "treo", nó sẽ không quay trở lại. Làm thế nào để biết khi tìm kiếm được thực hiện nếu không có kết quả phù hợp?
reggaeg Ức

2

Lưu ý rằng trong powershell v1.0 và v2.0, bạn cần chỉ định tham số vị trí đầu tiên (đường dẫn) để làm việc với -Recursion

tài liệu kỹ thuật

-Recurse

Nhận các mục trong các vị trí được chỉ định và trong tất cả các mục con của các vị trí.

Trong Windows PowerShell 2.0 và các phiên bản Windows PowerShell trước đó, tham số Recurse chỉ hoạt động khi giá trị của tham số Đường dẫn là một thùng chứa có các mục con, chẳng hạn như C: \ Windows hoặc C: \ Windows *, chứ không phải khi nó là một mục không có mục con, chẳng hạn như C: \ Windows * .exe.



0

Chuỗi chọn có một -Listtham số cho mục đích này:

Chỉ trả lại kết quả khớp đầu tiên trong mỗi tệp đầu vào. Theo mặc định, Chuỗi chọn trả về một đối tượng MatchInfo cho mỗi kết quả khớp được tìm thấy.

- ss64.com

Bạn có thể sử dụng nó như thế này:

gci -Recurse | sls -List FOOBAR

Đây là một số kết quả mẫu trông như thế nào (tìm kiếm Windows SDK cho 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)

Nếu bạn muốn lấy lại các FileInfođối tượng thực tế (thay vì Đường dẫn tương đối và một kết quả khớp duy nhất), bạn có thể sử dụng nó như thế này:

Get-ChildItem -Recurse -File | where { Select-String -Path $_ -List -Pattern FOOBAR }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.