ด้วยfind:
cd /the/dir
find . -type f -exec grep pattern {} +
( -type fเป็นการค้นหาในไฟล์ปกติเท่านั้น(ยกเว้นการเชื่อมโยงด้วยแม้ว่าจะชี้ไปที่ไฟล์ปกติ) หากคุณต้องการค้นหาไฟล์ทุกประเภทยกเว้นไดเรกทอรี (แต่ระวังว่ามีไฟล์บางประเภทเช่น fifos หรือ / dev / ศูนย์ที่ โดยทั่วไปคุณไม่ต้องการอ่าน) แทนที่-type fด้วย GNU เฉพาะ! -xtype d( -xtype dจับคู่สำหรับไฟล์ของไดเรกทอรีประเภทหลังจากความละเอียด symlink))
ด้วย GNU grep:
grep -r pattern /the/dir
(แต่ระวังว่าถ้าคุณไม่มี grep GNU รุ่นล่าสุดที่จะติดตาม symlink เมื่อเรียงลำดับจากไดเรกทอรี) ไฟล์ที่ไม่ปกติจะไม่ถูกค้นหาจนกว่าคุณจะเพิ่ม-D readตัวเลือก GNU รุ่นล่าสุดgrepจะยังไม่ค้นหาการเชื่อมโยงภายใน
GNU รุ่นเก่ามากfindไม่รองรับ{} +ไวยากรณ์มาตรฐานแต่คุณสามารถใช้ที่ไม่ได้มาตรฐานได้:
cd /the/dir &&
find . -type f -print0 | xargs -r0 grep pattern
การแสดงมีแนวโน้มว่าจะถูกผูกไว้ I / O นั่นคือเวลาที่จะทำการค้นหาจะเป็นเวลาที่จำเป็นในการอ่านข้อมูลทั้งหมดจากที่เก็บข้อมูล
หากข้อมูลอยู่ในดิสก์อาร์เรย์ที่ซ้ำซ้อนการอ่านไฟล์หลายไฟล์ในแต่ละครั้งอาจช่วยเพิ่มประสิทธิภาพ (และอาจทำให้ไฟล์เหล่านั้นด้อยลง) หากการแสดงไม่ได้ผูก I / O (เพราะเช่นข้อมูลทั้งหมดอยู่ในแคช) และคุณมี CPU หลายตัวการทำงานพร้อมกันgrepsอาจช่วยได้เช่นกัน คุณสามารถทำได้ด้วยตัวเลือกxargsของGNU-P
ตัวอย่างเช่นหากข้อมูลอยู่ในอาเรย์ RAID1 ที่มี 3 ไดรฟ์หรือหากข้อมูลอยู่ในแคชและคุณมีซีพียู 3 ตัวที่มีเวลาว่าง:
cd /the/dir &&
find . -type f -print0 | xargs -n1000 -r0P3 grep pattern
(ที่นี่ใช้-n1000เพื่อวางไข่ใหม่grepทุกๆ 1,000 ไฟล์สูงสุด 3 ทำงานพร้อมกันในแต่ละครั้ง)
อย่างไรก็ตามโปรดทราบว่าหากผลลัพธ์ของการgrepเปลี่ยนเส้นทางคุณจะจบลงด้วยการส่งออก interleaved ไม่ดีจาก 3 grepกระบวนการซึ่งในกรณีนี้คุณอาจต้องการที่จะเรียกใช้เป็น:
find . -type f -print0 | stdbuf -oL xargs -n1000 -r0P3 grep pattern
(สถานที่ล่าสุดของกนูหรือระบบ FreeBSD) หรือใช้--line-bufferedตัวเลือกของ grepGNU
ถ้าpatternเป็นสตริงคงที่การเพิ่ม-Fตัวเลือกสามารถปรับปรุงเรื่องต่างๆได้
หากไม่ใช่ข้อมูลอักขระหลายไบต์หรือสำหรับรูปแบบที่ตรงกันนั้นไม่สำคัญว่าข้อมูลนั้นเป็นอักขระหลายไบต์หรือไม่ก็ตาม:
cd /the/dir &&
LC_ALL=C grep -r pattern .
สามารถปรับปรุงประสิทธิภาพได้อย่างมาก
หากคุณทำการค้นหาดังกล่าวบ่อยครั้งคุณอาจต้องการจัดทำดัชนีข้อมูลโดยใช้หนึ่งในเครื่องมือค้นหามากมาย
findกับxargsหรือgrep -R