ฉันจะค้นหาไฟล์. java ทั้งหมดเพื่อหาสตริงแบบง่าย ๆ (ไม่ใช่ regex) ในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยทั้งหมดใน Mac OS X ได้อย่างไร ฉันแค่ต้องการพิมพ์รายชื่อไฟล์และไดเรกทอรีที่ตรงกัน
ฉันจะค้นหาไฟล์. java ทั้งหมดเพื่อหาสตริงแบบง่าย ๆ (ไม่ใช่ regex) ในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยทั้งหมดใน Mac OS X ได้อย่างไร ฉันแค่ต้องการพิมพ์รายชื่อไฟล์และไดเรกทอรีที่ตรงกัน
คำตอบ:
และเป็นที่นิยมอยู่เสมอ
find . -name '*.java' | xargs grep -l 'string'
แก้ไข (โดย Frank Szczerba):
หากคุณกำลังจัดการกับชื่อไฟล์หรือไดเรกทอรีที่มีช่องว่างในพวกเขาวิธีที่ปลอดภัยที่สุดคือ:
find . -name '*.java' -print0 | xargs -0 grep -l 'string'
มีมากกว่าหนึ่งวิธีที่จะทำ
mdfind
เป็นวิธี OSX เพิ่มเติมที่จะทำเช่นนี้ !
คำตอบ UNIX แบบดั้งเดิมจะเป็นคำตอบที่ได้รับการยอมรับสำหรับคำถามนี้:
find . -name '*.java' | xargs grep -l 'string'
สิ่งนี้อาจใช้ได้กับไฟล์ Java แต่ช่องว่างในชื่อไฟล์นั้นใช้กันทั่วไปใน Mac มากกว่าในโลก UNIX ทั่วไป เมื่อชื่อไฟล์ที่มีช่องว่างถูกส่งผ่านไปป์ไลน์ข้างต้น xargs จะตีความคำแต่ละคำว่าเป็นชื่อที่แตกต่างกัน
สิ่งที่คุณต้องการคือการแยกชื่อออกจากกันเพื่อทำให้ขอบเขตไม่ชัดเจน:
find . -name '*.java' -print0 | xargs -0 grep -l 'string'
ทางเลือกคือให้ค้นหา grep สำหรับคุณตามที่ Mark แนะนำแม้ว่าวิธีการนั้นจะช้ากว่าหากคุณกำลังค้นหาไฟล์จำนวนมาก (เนื่องจาก grep ถูกเรียกใช้หนึ่งครั้งต่อไฟล์แทนที่จะเป็นหนึ่งครั้งพร้อมกับรายการไฟล์ทั้งหมด)
ใช้ grep ที่ดีกว่า grep, ack :
ack -l --java "string"
วิธีนี้จะใช้ regex หากคุณต้องการเพียงอยู่ห่างจาก metacharacters หรือหลบหนีพวกเขาและคุณสามารถค้นหาสตริง
find . -iname "*.java" -exec egrep -il "search string" {} \;
grep -rl --include="*.java" simplestring *
ข้ามfind
และใช้Spotlight
จากบรรทัดคำสั่ง มีพลังมากขึ้น!
คนส่วนใหญ่ไม่รู้ว่าคุณสามารถค้นหาด้วย Spotlight ได้จากบรรทัดคำสั่ง เหตุใดจึงจำตัวเลือกการค้นหาและ grep ทั้งหมดของอาร์เคนและไม่สามารถให้ Spotlight ทำงานให้คุณได้ อินเตอร์เฟสบรรทัดคำสั่งไปยัง Spotlight เรียกว่า mdfind มันมีพลังเช่นเดียวกับการค้นหา GUI Spotlight และอื่น ๆ เพราะมันเป็นสคริปต์ที่บรรทัดคำสั่ง!
ให้มันเป็นไป:
grep -rl "string" */*java
คุณยังสามารถใช้โปรแกรม GUI เช่นTextWranglerเพื่อทำการค้นหาได้ง่ายขึ้นโดยที่ตัวเลือกนั้นอยู่ในส่วนต่อประสาน
grep "(your string)" -rl $(find ./ -name "*.java")
หากคุณต้องการละเว้นกรณีและปัญหาให้แทนที่ -rl ด้วย -irl (สตริงของคุณ) อาจเป็น regex หากคุณเคยเห็นความต้องการ