grep ไฟล์. java ทั้งหมดในไดเรกทอรีสำหรับสตริงเฉพาะ


12

ฉันจะค้นหาไฟล์. java ทั้งหมดเพื่อหาสตริงแบบง่าย ๆ (ไม่ใช่ regex) ในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยทั้งหมดใน Mac OS X ได้อย่างไร ฉันแค่ต้องการพิมพ์รายชื่อไฟล์และไดเรกทอรีที่ตรงกัน


ขอบคุณที่ถามคำถามนี้ดังนั้นฉันไม่จำเป็นต้อง ตอนนี้ฉันต้องหาวิธีที่จะยกเว้น ".git" และฉันทำไปเล็กน้อย
Dan Rosenstark

ฉันคิดว่าคำตอบของ js นั้นสั้นกระชับกว่า แต่คุณก็ยังต้องพิมพ์ออกไป - รวม แต่ยัง อาจจะแค่เขียนนามแฝงเพื่อซ่อนสิ่งนั้น
Craig Tataryn

คำตอบ:


19

และเป็นที่นิยมอยู่เสมอ

find . -name '*.java' | xargs grep -l 'string'

แก้ไข (โดย Frank Szczerba):

หากคุณกำลังจัดการกับชื่อไฟล์หรือไดเรกทอรีที่มีช่องว่างในพวกเขาวิธีที่ปลอดภัยที่สุดคือ:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

มีมากกว่าหนึ่งวิธีที่จะทำ



11

คำตอบ UNIX แบบดั้งเดิมจะเป็นคำตอบที่ได้รับการยอมรับสำหรับคำถามนี้:

find . -name '*.java' | xargs grep -l 'string'

สิ่งนี้อาจใช้ได้กับไฟล์ Java แต่ช่องว่างในชื่อไฟล์นั้นใช้กันทั่วไปใน Mac มากกว่าในโลก UNIX ทั่วไป เมื่อชื่อไฟล์ที่มีช่องว่างถูกส่งผ่านไปป์ไลน์ข้างต้น xargs จะตีความคำแต่ละคำว่าเป็นชื่อที่แตกต่างกัน

สิ่งที่คุณต้องการคือการแยกชื่อออกจากกันเพื่อทำให้ขอบเขตไม่ชัดเจน:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

ทางเลือกคือให้ค้นหา grep สำหรับคุณตามที่ Mark แนะนำแม้ว่าวิธีการนั้นจะช้ากว่าหากคุณกำลังค้นหาไฟล์จำนวนมาก (เนื่องจาก grep ถูกเรียกใช้หนึ่งครั้งต่อไฟล์แทนที่จะเป็นหนึ่งครั้งพร้อมกับรายการไฟล์ทั้งหมด)


นอกจากนี้คุณยังสามารถใช้ตัวเลือก "--replace" ใน xargs เพื่อจัดการกับชื่อไฟล์ที่มีช่องว่างในนั้น: ... | xargs - แทนที่ grep 'string' '{}' ({} จะถูกแทนที่ด้วยชื่อไฟล์)
arathorn

1
รุ่นค้นหาสมัยใหม่ (รวมถึงรุ่นที่ติดตั้งบน OS X) รองรับ "-exec <command> {} +" โดยที่เครื่องหมายบวกที่ท้าย (แทน \;) บอกให้ค้นหาแทนที่ {} ด้วยชื่อพา ธ มากที่สุด ... นี่คล้ายกับของ xargs (1) "(จากหน้า man)
Doug Harris

7

ใช้ grep ที่ดีกว่า grep, ack :

ack -l --java  "string" 

3
แอ๊ไม่ได้ติดตั้งบน Mac OS X เป็นค่าเริ่มต้น
John Topley

ฉันไม่รู้ว่า "โดยค่าเริ่มต้น" หมายถึงอะไร ในหลาย ๆ ระบบปฏิบัติการคุณเลือกสิ่งที่คุณติดตั้งดังนั้นจึงเป็นการยากที่จะค้นหาโปรแกรมที่มีอยู่เสมอ ในเวลาที่คอมไพเลอร์ C ก็มักจะมีและ Perl เป็นเรื่องแปลก ...
bortzmeyer

1
หมายความว่าเป็นส่วนหนึ่งของการติดตั้งระบบปฏิบัติการมาตรฐาน ฉันมีเครื่องมือสำหรับนักพัฒนาติดตั้งบน Mac ของฉันและพวกเขาไม่ได้ติดตั้ง ack คุณต้องติดตั้งด้วยตัวเอง หากคุณมีมันก็เป็นไวยากรณ์ที่ดี
John Topley

ในกรณีของ ack เป็นโปรแกรม Perl ตัวเดียวที่ไม่มีการพึ่งพาโมดูล หากคุณสามารถ "ติดตั้ง" โปรแกรมในไดเรกทอรี ~ / bin ของคุณคุณสามารถ "ติดตั้ง" ack ได้อย่างง่ายดาย
Andy Lester

4

วิธีนี้จะใช้ regex หากคุณต้องการเพียงอยู่ห่างจาก metacharacters หรือหลบหนีพวกเขาและคุณสามารถค้นหาสตริง

find . -iname "*.java" -exec egrep -il "search string" {} \;


3
grep -rl --include="*.java" simplestring *

1
นี่น่าจะเป็นคำตอบที่ดีที่สุดที่นี่ - ถ้า grep ทำทุกอย่างแล้วทำไมต้องใช้ find & xargs?
Peter Gibson

FYI ได้รับสิ่งที่ถามในคำถามที่มันควรจะเป็นขนาดเล็ก "L" ไม่ใหญ่ "L" ในคำสั่งที่
เครก Tataryn

เครกถูกต้องฉันแก้ไขคำตอบของฉัน
js

1

เนื่องจากนี่เป็นคำถามของ OSX นี่คือคำตอบเฉพาะของ OSX เพิ่มเติม

ข้ามfindและใช้Spotlightจากบรรทัดคำสั่ง มีพลังมากขึ้น!

สปอตไลท์คอมมานด์ - พบกับ GREP

คนส่วนใหญ่ไม่รู้ว่าคุณสามารถค้นหาด้วย Spotlight ได้จากบรรทัดคำสั่ง เหตุใดจึงจำตัวเลือกการค้นหาและ grep ทั้งหมดของอาร์เคนและไม่สามารถให้ Spotlight ทำงานให้คุณได้ อินเตอร์เฟสบรรทัดคำสั่งไปยัง Spotlight เรียกว่า mdfind มันมีพลังเช่นเดียวกับการค้นหา GUI Spotlight และอื่น ๆ เพราะมันเป็นสคริปต์ที่บรรทัดคำสั่ง!


0

ให้มันเป็นไป:

grep -rl "string" */*java

1
สิ่งนี้ให้ "grep: * / * java: ไม่มีไฟล์หรือไดเรกทอรี" ใน Mac OS X.
John Topley

ปัญหาที่นี่คือจะพบไฟล์ * .java เพียงระดับเดียวเท่านั้น ดูคำตอบของ Mark Thalman สำหรับ IMHO เกี่ยวกับวิธีการที่เหมาะสมในการดำเนินการ
Ludwig Weinzierl

ขออภัยไม่ใช่ Mac ของฉัน grep รุ่น Mac ไม่มีแฟล็ก -r (เรียกซ้ำ) หรือไม่
dwj

แต่นั่นเป็นผลลัพธ์ที่ฉันได้รับเมื่อค้นหาสตริงที่ฉันรู้ว่าอยู่ในไฟล์
John Topley


0
grep "(your string)" -rl $(find ./ -name "*.java")

หากคุณต้องการละเว้นกรณีและปัญหาให้แทนที่ -rl ด้วย -irl (สตริงของคุณ) อาจเป็น regex หากคุณเคยเห็นความต้องการ

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