1) ما هو أمر find ولماذا نستخدمه؟
أمر find يستخدم للبحث عن ملفات ومجلدات داخل مسار معيّن بناءً على شروط مثل:
- الاسم (name)
- النوع (ملف/مجلد/رابط)
- الحجم (size)
- التاريخ (mtime/atime)
- الصلاحيات (perm)
- المالك (user/group)
متى يفيدك؟
- عندما تضيع منك ملفات داخل مشروع كبير
- البحث عن ملفات كبيرة تستهلك مساحة
- حذف ملفات مؤقتة مثل
.tmp - تنفيذ أمر على كل الملفات المطابقة (نسخ/نقل/ضغط…)
2) الصيغة العامة (Syntax)
find [PATH] [EXPRESSION]Bash- PATH: أين تبحث؟ (مثل
.أو~/projectأو/var/log) - EXPRESSION: الشروط (مثل
-name,-type,-size…)
إذا لم تكتب PATH → يستخدم المجلد الحالي.
3) مثال تجهيز بيئة تدريب (اختياري لكن مفيد)
cd ~/project
mkdir -p find_demo/dir1 find_demo/dir2
touch find_demo/file1.txt find_demo/file2.log
touch find_demo/dir1/note.txt find_demo/dir2/temp.tmp
ln -s find_demo/file1.txt find_demo/link_to_file1Bash4) أساسيات find
أ) عرض كل شيء داخل المجلد الحالي (قد يكون كثير)
find .Bashب) البحث باسم ملف محدد: -name
find . -name "file1.txt"Bashج) البحث بنمط (wildcard)
find . -name "*.txt"Bash
-nameحساس لحالة الأحرف. لو تريد بدون حساسية:
find . -iname "*.TXT"Bash5) البحث حسب النوع: -type
أهم الأنواع:
fملف عادي (regular file)dمجلد (directory)lرابط رمزي (symlink)
أ) كل المجلدات فقط
find . -type dBashب) كل الملفات فقط
find . -type fBashج) كل الروابط الرمزية فقط
find . -type lBashمثال مركّب: ملفات txt فقط
find . -type f -name "*.txt"Bash6) البحث حسب الحجم: -size
أمثلة مهمة:
ملفات أكبر من 1 ميجابايت
find . -type f -size +1MBashملفات أصغر من 100 كيلوبايت
find . -type f -size -100kBashملفات حجمها بالضبط 0 (فارغة)
find . -type f -emptyBash7) تحديد عمق البحث (مفيد للمبتدئين): -maxdepth
ابحث فقط في المستوى الحالي بدون الدخول للمجلدات الفرعية
find . -maxdepth 1 -type fBashابحث حتى عمق 2
find . -maxdepth 2 -name "*.txt"Bash8) البحث حسب الوقت (mtime) — عملي جدًا
ملفات تم تعديلها خلال آخر يوم (24 ساعة)
find . -type f -mtime -1Bashملفات أقدم من 30 يوم
find . -type f -mtime +30Bash
mtime= وقت تعديل المحتوى.
9) استبعاد مسارات/مجلدات أثناء البحث: -path + -prune
مثال: ابحث في المشروع لكن تجاهل .git و node_modules:
find . \( -path "./.git" -o -path "./node_modules" \) -prune -o -type f -name "*.js" -printBashهذه صيغة متقدمة قليلًا، لكن مفيدة جدًا للمشاريع الكبيرة.
10) تنفيذ أوامر على النتائج: -exec
هذه أقوى ميزة في find.
أ) عرض الملفات مع تفاصيل ls -l
find . -type f -name "*.txt" -exec ls -l {} \;Bashب) قراءة أول 3 أسطر من كل ملف txt
find . -type f -name "*.txt" -exec head -n 3 {} \;Bashج) نسخ الملفات المطابقة لمجلد backup
أولًا جهّز المجلد:
mkdir -p ~/project/backup_txtBashثم:
find . -type f -name "*.txt" -exec cp {} ~/project/backup_txt/ \;Bashملاحظة: هذا ينسخ باسم الملف فقط وقد يحدث تضارب إذا في ملفين بنفس الاسم من مجلدات مختلفة.
11) حذف ملفات — انتبه جدًا (Safe Delete)
في الدرس عندك استخدموا -delete، وهو صحيح لكنه خطير لو الشرط غلط.
أ) الطريقة الآمنة: اعرض أولًا
find . -type f -name "*.tmp"Bashب) ثم احذف بعد التأكد
خيار 1: حذف مباشر (سريع وخطير لو أخطأت)
find . -type f -name "*.tmp" -deleteBashخيار 2 (أنصح للمبتدئ): اسأل قبل كل حذف
find . -type f -name "*.tmp" -exec rm -i {} \;Bashخيار 3: تأكيد واحد لكل مجموعة (أخف من -i)
find . -type f -name "*.tmp" -ok rm {} \;Bash
-okيشبه-execلكن يسألك قبل التنفيذ.
12) دمج find مع grep (بحث داخل الملفات) — استخدام واقعي جدًا
مثال: ابحث عن كلمة “password” داخل ملفات .conf:
find /etc -type f -name "*.conf" -exec grep -nH "password" {} \; 2>/dev/nullBash-nرقم السطر-Hاسم الملف2>/dev/nullلإخفاء أخطاء الصلاحيات
13) تدريب سريع (Practice)
نفّذ هذا على الهيكل الذي أنشأناه:
cd ~/project/find_demo
# 1) كل txt
find . -type f -name "*.txt"
# 2) كل الروابط الرمزية
find . -type l
# 3) ملفات فارغة
find . -type f -empty
# 4) احذف ملفات tmp بشكل آمن (اعرض ثم احذف)
find . -type f -name "*.tmp"
find . -type f -name "*.tmp" -exec rm -i {} \;Bashهل الشرح الأصلي كافي؟
نعم كبداية ممتاز، لكن الإضافات التي يحتاجها المبتدئ عادةً:
-maxdepthللتحكم بعمق البحث-inameللبحث بدون حساسية أحرف-mtimeللبحث حسب الزمن- طريقة الاستبعاد
-pruneللمجلدات الثقيلة - حذف آمن بدل
-deleteمباشرة