البحث في Linux: grep و find بالتفصيل
ملف سجلات فيه مئة ألف سطر، والخطأ الذي تبحث عنه في سطر واحد منها. ومشروع فيه آلاف الملفات، وتريد كل ملف كُتبت فيه كلمة TODO. هذه مواقف يومية لكل من يعمل على Linux، وحلها أمران: grep يبحث داخل الملفات، و find يبحث عن الملفات. رأيتهما سريعاً في درس الملفات، والآن ستتقنهما.
سنعمل في مجلد فيه ملف السجلات logs/app.log (ثمانية أسطر)، ومجلد projects/site فيه ملفات موقع، وبعض الملفات الأخرى.
grep: ابحث داخل الملفات
Section titled “grep: ابحث داخل الملفات”grep ERROR logs/app.log2026-11-10 09:10:03 ERROR Database connection failed2026-11-10 09:10:09 ERROR Database connection failedgrep نص ملف: يطبع كل سطر يحتوي النص. تخيّله مثل قلم التظليل: يمر على الصفحات كلها ويُخرج لك الأسطر التي فيها كلمتك فقط.
والبحث حساس لحالة الحروف: في الملف سطر ثالث فيه error بحروف صغيرة لم يظهر. لتجاهل الحالة أضف -i:
grep -i error logs/app.log2026-11-10 09:10:03 ERROR Database connection failed2026-11-10 09:10:09 ERROR Database connection failed2026-11-10 09:15:00 error cache write failedأهم خيارات grep
Section titled “أهم خيارات grep”grep -n ERROR logs/app.log4:2026-11-10 09:10:03 ERROR Database connection failed6:2026-11-10 09:10:09 ERROR Database connection failed-n تضيف رقم السطر، فتذهب إليه في المحرر مباشرة.
grep -c INFO logs/app.log4-c تعدّ الأسطر المطابقة بدل طباعتها.
grep -v INFO logs/app.log2026-11-10 09:07:45 WARNING Disk usage at 85%2026-11-10 09:10:03 ERROR Database connection failed2026-11-10 09:10:09 ERROR Database connection failed2026-11-10 09:15:00 error cache write failed-v تعكس البحث: الأسطر التي لا تحتوي النص. مفيدة لإخفاء الضجيج ورؤية المهم.
| الخيار | الوظيفة |
|---|---|
-i |
تجاهل حالة الحروف |
-n |
عرض رقم السطر |
-c |
عدّ الأسطر المطابقة |
-v |
الأسطر غير المطابقة |
-w |
الكلمة كاملة فقط: in لا تطابق INFO |
-A 2 |
اعرض سطرين بعد كل نتيجة، و -B قبلها |
البحث في مجلد كامل
Section titled “البحث في مجلد كامل”-r تبحث في المجلد وكل ما تحته:
grep -r TODO ../notes.txt:TODO call Omar./projects/site/app.js:// TODO: validate form./projects/site/index.html:<!-- TODO: add footer -->النقطة . تعني المجلد الحالي، وقبل كل نتيجة اسم ملفها. وإذا أردت أسماء الملفات فقط استخدم -l، ولحصر البحث في نوع معيّن استخدم --include:
grep -rn --include="*.js" TODO ../projects/site/app.js:1:// TODO: validate formأنماط البحث
Section titled “أنماط البحث”grep لا يبحث عن نص حرفي فقط، بل عن أنماط. أهمها:
grep -E "ERROR|WARNING" logs/app.log2026-11-10 09:07:45 WARNING Disk usage at 85%2026-11-10 09:10:03 ERROR Database connection failed2026-11-10 09:10:09 ERROR Database connection failed-E تفعّل الأنماط الموسعة، والعلامة | تعني «أو».
grep "failed$" logs/app.log2026-11-10 09:10:03 ERROR Database connection failed2026-11-10 09:10:09 ERROR Database connection failed2026-11-10 09:15:00 error cache write failed| الرمز | المعنى | مثال |
|---|---|---|
^ |
بداية السطر | ^2026 أسطر تبدأ بـ 2026 |
$ |
نهاية السطر | failed$ أسطر تنتهي بـ failed |
. |
أي حرف واحد | h.t تطابق hat و hot |
a|b مع -E |
هذا أو ذاك | ERROR|WARNING |
هذه الأنماط اسمها التعابير النمطية (Regular Expressions)، وهي لغة كاملة ستقابلها في كل لغات البرمجة.
find: ابحث عن الملفات
Section titled “find: ابحث عن الملفات”find يبحث عن الملفات نفسها حسب خصائصها: الاسم، والنوع، والحجم، وتاريخ التعديل.
find . -name "*.log"./logs/app.log./logs/old/app-2025.logfind مكان شروط: ابدأ من المجلد الحالي . وانزل في كل المجلدات الفرعية. تخيّله مثل أمين مخزن يمشي في كل الممرات ويفتح كل الصناديق بحثاً عما وصفته له.
-name حساسة لحالة الحروف، و -iname تتجاهلها:
find . -name "report.txt"find . -iname "report.txt"./Documents/Report.txtالأمر الأول لم يجد شيئاً، لأن اسم الملف يبدأ بحرف كبير.
شروط أخرى
Section titled “شروط أخرى”find . -type d../Documents./logs./logs/old./projects./projects/site| الشرط | المعنى |
|---|---|
-type f و -type d |
ملفات فقط، أو مجلدات فقط |
-size +10M |
أكبر من 10 ميغابايت، و -size -1k أصغر من كيلوبايت |
-mtime -7 |
عُدّل خلال آخر 7 أيام، و +30 قبل أكثر من 30 يوماً |
-empty |
ملفات ومجلدات فارغة |
-maxdepth 1 |
لا تنزل أعمق من مستوى واحد |
والشروط تُجمع، فيجب أن تتحقق كلها: find . -type f -name "*.log" -size +10M تجد ملفات السجلات الضخمة التي تملأ القرص.
نفّذ أمراً على كل نتيجة
Section titled “نفّذ أمراً على كل نتيجة”قوة find الحقيقية أنه لا يكتفي بعرض النتائج. -exec تنفّذ أمراً على كل ملف يجده:
find projects -name "*.js" -exec wc -l {} \;3 projects/site/app.js{}: مكان يوضع فيه اسم كل ملف.\;: علامة نهاية الأمر.
والحذف له خيار خاص:
find . -name "*.tmp"./logs/session.tmp./projects/site/cache.tmpfind . -name "*.tmp" -deleteبعدها يُرجع البحث نفسه نتيجة فارغة: حُذف الملفان.
grep و find معاً
Section titled “grep و find معاً”find يختار الملفات، و grep يبحث داخلها:
find . -name "*.log" -exec grep -c ERROR {} \;21خطآن في السجل الحالي وخطأ في القديم.
جرّب بنفسك
Section titled “جرّب بنفسك”- أنشئ ملفاً
log.txtفيه عشرة أسطر، بعضها يحتويokوبعضهاfailوواحدFAIL. - اعرض أسطر الفشل كلها مع أرقامها (تلميح:
-iو-n)، ثم عدّها بـ-c. - اعثر على كل الملفات التي تنتهي بـ
.txtفي مجلدك الشخصي ولا تنزل أعمق من مستويين. - تحدٍّ: اعثر على كل ملفات
.txtالتي تحتوي الكلمةfail، باستخدامfindمع-exec grep -l.
أخطاء شائعة
Section titled “أخطاء شائعة”- نسيان علامات التنصيص مع النجمة:
find . -name *.logقد تفسر الطرفية النجمة قبلfindفتتغير النتيجة. اكتب"*.log". - نسيان
-rمع مجلد:grep TODO projectsيعطيgrep: projects: Is a directory. - نسيان
\;بعد-exec: يعطيfind: missing argument to '-exec'. - الخلط بين الأمرين:
grepللبحث في المحتوى، وfindللبحث عن الملفات بـ خصائصها.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
أي أمر يعرض الأسطر التي لا تحتوي الكلمة DEBUG في ملف app.log؟
الخيار -v يعكس البحث فيعرض الأسطر غير المطابقة.
سؤال
ما الذي يبحث عنه الأمر find . -type d -name "test"؟
find يبحث بالخصائص، و -type d تحصر النتائج في المجلدات.
الخلاصة
Section titled “الخلاصة”grep نص ملفيطبع الأسطر المطابقة، و-iو-nو-cو-vأهم خياراته.grep -rيبحث في مجلد كامل، و-Eمع|و^و$لأنماط أقوى.find مكان شروطيبحث عن الملفات بالاسم والنوع والحجم والتاريخ.-exec أمر {} \;ينفّذ أمراً على كل نتيجة، و-deleteيحذف.- اعرض النتائج أولاً قبل أي حذف، وضع الأنماط بين علامتي تنصيص.