ฉันจะใช้ grep เพื่อค้นหาไดเรกทอรีปัจจุบันสำหรับไฟล์ใด ๆ และทั้งหมดที่มีสตริง "hello" และแสดงเฉพาะไฟล์. h และ. cc ได้อย่างไร
ฉันจะใช้ grep เพื่อค้นหาไดเรกทอรีปัจจุบันสำหรับไฟล์ใด ๆ และทั้งหมดที่มีสตริง "hello" และแสดงเฉพาะไฟล์. h และ. cc ได้อย่างไร
คำตอบ:
grep -r --include=*.{cc,h} "hello" .
การอ่านนี้: ค้นหาแบบวนซ้ำ (ในทุกไดเรกทอรีย่อยด้วย) สำหรับไฟล์. cc หรือ. h ทั้งหมดที่มี "hello" ใน.
ไดเรกทอรีนี้(ปัจจุบัน)
คุณสามารถส่งต่อใน wildcard แทนการระบุชื่อไฟล์หรือใช้ stdin
grep hello *.h *.cc
-R
ไม่สามารถทำงานได้อย่างน่าเสียดาย มันขยาย*
ก่อนที่จะไปซ้ำ
find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello"
.
ตรวจสอบหน้าคู่มือสำหรับfind
และxargs
สำหรับรายละเอียด
-print0
ตามหลัง'*.cc'
เป็นอย่างอื่นคุณไม่มีการกระทำสำหรับส่วนหนึ่งของการค้นหา find . \( -name '*.cc' -or -name '*.h' \) -print0
หรือคุณต้องใส่วงเล็บในการมี:
find -exec +
ไวยากรณ์แทน xargs
-exec grep "hello" {} +
โดยที่คู่ของเครื่องหมายวงเล็บแสดงชื่อไฟล์ คำแนะนำที่ดี
ในการค้นหาในไดเรกทอรีปัจจุบันซ้ำ:
grep -r 'myString' .
หากคุณต้องการค้นหาแบบเรียกซ้ำคุณมีตัวเลือกมากมาย 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 ของและfind
xargs
find ... -exec grep "hello" {} +
หากฉันอ่านคำถามของคุณอย่างถี่ถ้วนคุณขอให้ "grep เพื่อค้นหาไดเรกทอรีปัจจุบันสำหรับไฟล์ใด ๆ และทั้งหมดที่มีสตริง" hello "และแสดงเฉพาะไฟล์. h และ. cc" ดังนั้นเพื่อตอบสนองความต้องการที่แม่นยำของคุณที่นี่คือการส่งของฉัน:
แสดงชื่อไฟล์:
grep -lR hello * | egrep '(cc|h)$'
... และสิ่งนี้จะแสดงชื่อไฟล์และเนื้อหา:
grep hello `grep -lR hello * | egrep '(cc|h)$'`
grep -l hello **/*.{h,cc}
คุณอาจต้องการshopt -s nullglob
หลีกเลี่ยงข้อความแสดงข้อผิดพลาดหากไม่มีไฟล์. h หรือ no. cc
วิธีที่ง่ายที่สุด: grep -Ril "Your text" /
grep -si "hello" --include=*.{cc,h} ./* ./.*
(ค้นหาไฟล์ที่ซ่อนอยู่เช่นกัน) นี่เป็นรุ่นทั่วไปเพื่อค้นหาสตริงในไฟล์ /grep -s "hello" * .*
ซ่อนทั้งหมด: อาจจะมากที่สุดโดยทั่วไปที่มีประโยชน์ (และง่าย) การค้นหาทั้งหมดนี้ไม่ใช่ไฟล์ที่ซ่อนอยู่สำหรับ "สวัสดี":grep -si "hello" ./*
ขอขอบคุณที่โพสต์นี้: askubuntu.com/a/777456