ด้วย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
ตัวเลือกของ grep
GNU
ถ้าpattern
เป็นสตริงคงที่การเพิ่ม-F
ตัวเลือกสามารถปรับปรุงเรื่องต่างๆได้
หากไม่ใช่ข้อมูลอักขระหลายไบต์หรือสำหรับรูปแบบที่ตรงกันนั้นไม่สำคัญว่าข้อมูลนั้นเป็นอักขระหลายไบต์หรือไม่ก็ตาม:
cd /the/dir &&
LC_ALL=C grep -r pattern .
สามารถปรับปรุงประสิทธิภาพได้อย่างมาก
หากคุณทำการค้นหาดังกล่าวบ่อยครั้งคุณอาจต้องการจัดทำดัชนีข้อมูลโดยใช้หนึ่งในเครื่องมือค้นหามากมาย
find
กับxargs
หรือgrep -R