ฉันจะใช้ grep เพื่อค้นหาไดเรกทอรีปัจจุบันสำหรับไฟล์ทั้งหมดที่มีสตริง“ hello” แต่แสดงเฉพาะไฟล์. h และ. cc ได้อย่างไร


138

ฉันจะใช้ grep เพื่อค้นหาไดเรกทอรีปัจจุบันสำหรับไฟล์ใด ๆ และทั้งหมดที่มีสตริง "hello" และแสดงเฉพาะไฟล์. h และ. cc ได้อย่างไร

คำตอบ:


161
grep -r --include=*.{cc,h} "hello" .

การอ่านนี้: ค้นหาแบบวนซ้ำ (ในทุกไดเรกทอรีย่อยด้วย) สำหรับไฟล์. cc หรือ. h ทั้งหมดที่มี "hello" ใน.ไดเรกทอรีนี้(ปัจจุบัน)

จากคำถาม stackoverflow อื่น


5
ในโพสต์ต้นฉบับคุณพูดว่า "ไดเรกทอรีปัจจุบัน" และไม่มีอะไรเกี่ยวกับมันต้องการซ้ำหรือในไดเรกทอรีย่อย (ฉันรู้ว่าคุณพูดถึงมันในโพสต์ในภายหลัง) สำหรับผู้ที่สนใจในวิธีการทำเฉพาะในไดเรกทอรีปัจจุบันมันgrep -si "hello" --include=*.{cc,h} ./* ./.*(ค้นหาไฟล์ที่ซ่อนอยู่เช่นกัน) นี่เป็นรุ่นทั่วไปเพื่อค้นหาสตริงในไฟล์ / grep -s "hello" * .*ซ่อนทั้งหมด: อาจจะมากที่สุดโดยทั่วไปที่มีประโยชน์ (และง่าย) การค้นหาทั้งหมดนี้ไม่ใช่ไฟล์ที่ซ่อนอยู่สำหรับ "สวัสดี": grep -si "hello" ./* ขอขอบคุณที่โพสต์นี้: askubuntu.com/a/777456
jbobbins

1
grep -r --include=*.{java,py} "hello" .

ด้วยเหตุผลบางอย่างมันใช้ไม่ได้กับ macOS แม้ว่าจะใช้โปรแกรม grep ของ GNU ก็ตาม
xApple

49

คุณสามารถส่งต่อใน wildcard แทนการระบุชื่อไฟล์หรือใช้ stdin

grep hello *.h *.cc

ฉันต้องการไดเรกทอรีย่อยทั้งหมดด้วย
stackoverflow

การเพิ่ม-Rไม่สามารถทำงานได้อย่างน่าเสียดาย มันขยาย*ก่อนที่จะไปซ้ำ
Donald Miner

คำตอบของ Noufal คือสิ่งที่คุณกำลังมองหาถ้าคุณต้องการไดเรกทอรีย่อย
Donald Miner

8
@Jammin คุณควรเข้าใจอย่างถี่ถ้วนเมื่อถามคำถาม คำตอบนี้เป็นคำตอบที่ "ถูกต้อง" สำหรับคำถามที่คุณระบุ
จอร์แดน

$ grep -R hello *# find จากคำทั้งหมดมี hello (รวมถึงไดเรกทอรีย่อย)

19

find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello".

ตรวจสอบหน้าคู่มือสำหรับfindและxargsสำหรับรายละเอียด


1
คุณต้องมีการดำเนินการ-print0ตามหลัง'*.cc'เป็นอย่างอื่นคุณไม่มีการกระทำสำหรับส่วนหนึ่งของการค้นหา find . \( -name '*.cc' -or -name '*.h' \) -print0หรือคุณต้องใส่วงเล็บในการมี:
Jonathan Leffler

ขอบคุณที่สังเกตว่า ฉันได้แก้ไขคำตอบเพื่อ "แก้ไข" มัน
Noufal Ibrahim

3
คุณยังสามารถใช้find -exec +ไวยากรณ์แทน xargs
jordanm

@jordanm: ใช่: -exec grep "hello" {} +โดยที่คู่ของเครื่องหมายวงเล็บแสดงชื่อไฟล์ คำแนะนำที่ดี
Jonathan Leffler


5

หากคุณต้องการค้นหาแบบเรียกซ้ำคุณมีตัวเลือกมากมาย ackคุณควรพิจารณา

หากคุณมี GNU findและxargs:

find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null

การใช้/dev/nullเพื่อให้แน่ใจว่าคุณได้รับชื่อไฟล์ที่พิมพ์; -print0และ-0ข้อเสนอที่มีชื่อไฟล์ที่มีช่องว่าง (บรรทัดใหม่ ฯลฯ )

หากคุณไม่มีชื่อลางร้าย (ที่มีช่องว่าง ฯลฯ ) คุณสามารถใช้:

find . -name '*.*[ch]' -print | xargs grep hello /dev/null

สิ่งนี้อาจเลือกชื่อที่คุณไม่ได้ตั้งใจเพราะรูปแบบการจับคู่นั้นไม่ชัดเจน (แต่ง่ายกว่า) แต่ก็ใช้งานได้ และจะทำงานร่วมกับรุ่นที่ไม่ใช่ GNU ของและfindxargs


โปรดทราบว่าคุณสามารถพูดได้ว่าfind ... -exec grep "hello" {} +
fedorqui 'ดังนั้นหยุดการทำร้าย'

5

หากฉันอ่านคำถามของคุณอย่างถี่ถ้วนคุณขอให้ "grep เพื่อค้นหาไดเรกทอรีปัจจุบันสำหรับไฟล์ใด ๆ และทั้งหมดที่มีสตริง" hello "และแสดงเฉพาะไฟล์. h และ. cc" ดังนั้นเพื่อตอบสนองความต้องการที่แม่นยำของคุณที่นี่คือการส่งของฉัน:

แสดงชื่อไฟล์:

grep -lR hello * | egrep '(cc|h)$'

... และสิ่งนี้จะแสดงชื่อไฟล์และเนื้อหา:

grep hello `grep -lR hello * | egrep '(cc|h)$'`

2
grep -l hello **/*.{h,cc}

คุณอาจต้องการshopt -s nullglobหลีกเลี่ยงข้อความแสดงข้อผิดพลาดหากไม่มีไฟล์. h หรือ no. cc


4
ฉันรู้วิธีใช้ google ฯลฯ ฉันถามที่นี่เพราะคำตอบหลายคำมี "-l" และยินดีที่ได้รับข้อมูลทั้งหมดในที่เดียว
Andrew Swift

-l (ตัวพิมพ์เล็ก "el") ยับยั้งเอาต์พุตปกติ พิมพ์ชื่อของไฟล์อินพุตแต่ละไฟล์ซึ่งโดยปกติแล้วเอาต์พุตจะพิมพ์ออกมา การสแกน / การค้นหาจะหยุดในนัดแรก
Rex CoolCode Charles

-1

วิธีที่ง่ายที่สุด: grep -Ril "Your text" /


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