Powershell เทียบเท่า `grep -r -l` (- ไฟล์ที่มีการแข่งขัน)


44

ใน Powershell ฉันจะแสดงรายการไฟล์ทั้งหมดในไดเรกทอรี (วนซ้ำ) ที่มีข้อความที่ตรงกับ regex ที่กำหนดได้อย่างไร ไฟล์ที่สงสัยนั้นมีข้อความที่เข้าใจยากยาวมากดังนั้นฉันไม่ต้องการเห็นบรรทัดที่ตรงกัน - เพียงชื่อไฟล์

คำตอบ:


56

คุณสามารถใช้Select-Stringเพื่อค้นหาข้อความภายในไฟล์และSelect-Objectเพื่อส่งคืนคุณสมบัติเฉพาะสำหรับการแข่งขันแต่ละรายการ บางสิ่งเช่นนี้

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

หรือรุ่นที่สั้นกว่าโดยใช้นามแฝง:

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

หากคุณต้องการเพียงชื่อไฟล์ที่ไม่เส้นทางเต็มแทนที่ด้วยPathFilename


คำอธิบาย:

  1. Get-ChildItem-Recurse *.* ส่งคืนไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยทั้งหมด

  2. Select-String-Pattern "foobar" ค้นหาไฟล์เหล่านั้นเพื่อหารูปแบบ "foobar" ที่กำหนด

  3. Select-Object-Unique Pathส่งคืนเฉพาะพา ธ ไฟล์สำหรับแต่ละคู่ที่ตรงกัน -Uniqueซ้ำกันกำจัดพารามิเตอร์


select -Unique... เจ๋งเรียนรู้สิ่งใหม่ มันใช้งานได้ดีมากขอบคุณ!
Michael Kropat

คือ ต้องการจริงๆเหรอ? รับ -ItemItem- รีชาร์จทำงานเหมือนที่ฉันคิด
Piotr Perak

1
หรือกระชับยิ่งขึ้น gci -r | sls "foobar" | เลือกเส้นทางที่ไม่ซ้ำ
David Markle

หากไม่มีการจับคู่ PowerShell ว่า "หยุด" จะไม่ส่งคืน เราจะรู้ได้อย่างไรว่าการค้นหาเสร็จสิ้นหากไม่มีข้อมูลตรงกัน
reggaeguitar

2

โปรดทราบว่าใน powershell v1.0 และ v2.0 คุณต้องระบุพารามิเตอร์ตำแหน่งแรก (เส้นทาง) เพื่อทำงานกับ -Recursion

เอกสารทางเทคนิค

-Recurse

รับไอเท็มในตำแหน่งที่ระบุและในไอเท็มลูกทั้งหมดของตำแหน่ง

ใน Windows PowerShell 2.0 และ Windows PowerShell เวอร์ชันก่อนหน้าพารามิเตอร์ Recurse จะทำงานเฉพาะเมื่อค่าของพารามิเตอร์ Path เป็นคอนเทนเนอร์ที่มีรายการย่อยเช่น C: \ Windows หรือ C: \ Windows * และไม่ใช่เมื่อ รายการไม่มีรายการลูกเช่น C: \ Windows * .exe


1

ใช้คำสั่งด้านล่างในไดเรกทอรีที่คุณต้องการดำเนินการ "grep" และเปลี่ยน[SEARCH_PATTERN]ให้ตรงกับสิ่งที่คุณต้องการจับคู่ มันวนซ้ำค้นหาไฟล์ทั้งหมดในไดเรกทอรี

dir -Recurse | Select-String - pattern [SEARCH_PATTERN]

http://www.jamescoyle.net/how-to/1205-how-to-use-powershell-to-recursively-search-for-text-within-files-on-windows


0

Select-Stringมี-Listพารามิเตอร์สำหรับจุดประสงค์นี้:

ส่งคืนเฉพาะคู่แรกในไฟล์อินพุตแต่ละไฟล์ ตามค่าเริ่มต้น Select-String จะส่งคืนวัตถุ MatchInfo สำหรับการแข่งขันแต่ละครั้งที่พบ

- ss64.com

คุณสามารถใช้สิ่งนี้:

gci -Recurse | sls -List FOOBAR

นี่คือตัวอย่างผลลัพธ์ที่มีลักษณะเหมือน (ค้นหา 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)

หากคุณต้องการเรียกคืนFileInfoวัตถุจริง(แทน Path ที่สัมพันธ์กันและผลลัพธ์การจับคู่เดี่ยว) คุณอาจใช้สิ่งนี้:

Get-ChildItem -Recurse -File | where { Select-String -Path $_ -List -Pattern FOOBAR }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.