ค้นหาสตริงในไฟล์เฉพาะภายในไดเรกทอรีย่อย


10

สมมติว่าฉันต้องการค้นหาฟังก์ชันGetTypes()ในทุกไฟล์ต้นฉบับ C # ( .cs) ไดเรกทอรี / ไดเรกทอรีย่อย

ผมใช้แต่ฉันได้ข้อผิดพลาดกับgrep -rn GetTypes *.cs grep: *.cs: No such file or directoryฉันต้องใช้grep -rn GetTypes *แต่ในกรณีนี้มันแสดงไฟล์ทั้งหมดไม่*.csเพียง

ฉันต้องใช้คำสั่งอะไรเพื่อค้นหาสตริงใน.csไฟล์เท่านั้น?


คำตอบ:


12

ถ้าเปลือกของคุณเป็นทุบตี≥4ใส่ในของคุณshopt -s globstar ~/.bashrcหากเปลือกของคุณคือ zsh คุณก็ดี จากนั้นคุณสามารถเรียกใช้

grep -n GetTypes **/*.cs

**/*.csหมายถึงไฟล์ทั้งหมดที่ตรงกับ*.csในไดเรกทอรีปัจจุบันหรือในไดเรกทอรีย่อยซ้ำ

หากคุณไม่ได้ใช้เชลล์ที่รองรับ**แต่ grep ของคุณรองรับ--includeคุณสามารถทำ grep แบบซ้ำและบอกgrepให้พิจารณาเฉพาะไฟล์ที่ตรงกับรูปแบบบางอย่าง สังเกตเครื่องหมายคำพูดรอบรูปแบบชื่อไฟล์: มันตีความโดย grep ไม่ใช่เชลล์

grep -rn --include='*.cs' GetTypes .

ด้วยเครื่องมือแบบพกพาเท่านั้น (บางระบบไม่มีgrep -rเลย) ใช้findสำหรับส่วนการสำรวจไดเรกทอรีและgrepส่วนการค้นหาข้อความ

find . -name '*.cs' -exec grep -n GetTypes {} +

หากต้องการตั้งค่าglobstarตัวเลือกชั่วคราวสำหรับ Bash 4+ shell ปัจจุบันให้ใช้: shopt -s globstar.
tjanez

8

คุณควรตรวจสอบแทน grep / ค้นหาน้อย billiant ackรู้จักกันในนาม มันถูกตั้งค่าโดยเฉพาะสำหรับการค้นหาผ่านไดเรกทอรีของไฟล์รหัสต้นฉบับ

คำสั่งของคุณจะมีลักษณะเช่นนี้:

ack --csharp GetTypes

4

หากคุณใช้ GNU grepคุณสามารถระบุไฟล์ที่จะรวมในการสำรวจไดเรกทอรีซ้ำ:

grep --include '*.cs' -rn GetTypes .

(โดยที่ช่วงสุดท้ายแสดงถึงไดเร็กตอรี่การทำงานปัจจุบันเป็นรูทของการสำรวจเส้นทาง)


4

ฉันใช้การค้นหาและ grep ร่วมกัน:

find . -name "*.cs" | xargs grep "GetTypes" -bn --color=auto

สำหรับfindคุณสามารถแทนที่.ด้วยไดเรกทอรีและลบ-nameหากคุณต้องการดูทุกไฟล์

สำหรับgrep, -bnจะพิมพ์ตำแหน่งและจำนวนเส้นและ--colorจะช่วยให้ดวงตาของคุณโดยเน้นสิ่งที่คุณกำลังมองหา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.