اذهب إلى المحتوى

البحث عن الملفات والمجلدات على لينكس باستخدام الأمر find


Hassan Hedr

مهما كنت منظمًا في ترتيب ملفاتك ومجلداتك، ستجد نفسك في بعض الأحيان تحاول البحث عن ملف ما ولا تستطيع إيجاده. ربما تكون قد نسيت اسم الملف أو أحيانا تتذكر اسم الملف، ولكن تنسى أين قمت بحفظه. أحيانًا تحاول الوصول لملف لم تنشئه أنت أصلًا. مهما كان المأزق الذي تمرّ به، على نظام POSIX ستجد دومًا الأمر find لمساعدتك.

تثبيت الأمر find

الأمر find معرَّف ضمن معايير POSIX، والتي تحدد المقاييس المفتوحة التي تتبعها أنظمة POSIX. وببساطة عند استخدامك لأحد أنظمة التشغيل التي تتبع تلك المعايير ومنها لينكس، و BSD، وماك فالأمر find مثبت لديك مسبقًا.

مع ذلك ليست كل أوامر find متماثلة. مثلا الأمر نفسه في جنو يحوي مزايا غير موجودة في ذات الأمر find على أنظمة BSD أو بيزي بوكس Busybox أو سولاريس Solaris أو قد يحتوي على مزايا متماثلة لكن طريقة تضمينها مختلفة. في هذا المقال سنستخدم الأمر find الخاص بجنو الموجود في حزمة findutils بسبب سهولة توافرها وشعبيتها الكبيرة. معظم الأوامر التي سنشرحها في هذا المقال تعمل مع تضمينات أخرى للأمر find. ولتفادي الحصول على نتائج مختلفة نزِّل نسخة جنو من الأمر وثبتها لديك.

بحث عن ملف بالاسم

يمكنك العثور على ملف بالاسم عبر اسم الملف بالكامل أو أجزاء منه مع استخدام التعابير النمطية. الأمر find يحتاج أن تمرر له مسار المجلد الذي تريد البحث داخله، خيارات لتحديد الخاصية التي سيتم البحث من خلالها (مثلًا الخيار name- للبحث بإسم الملف حسّاس للحالة)، ثم نص البحث. افتراضيا سيتم معاملة نص البحث حرفيًا: الأمر find سيبحث عن الملفات التي تطابق تماما النص المُدخل بين علامتي اقتباس إلّا إذا كنت تستخدم صيغة التعبير النمطي.

بفرض أن مجلد مستنداتك يحوي أربع ملفات: Foo و foo و foobar.txt و foo.xml. يبحث الأمر التالي عن ملف باسم "foo" حرفيًا:

$ find ~ -name "foo"
/home/tux/Documents/examples/foo

يمكن جعل البحث غير حساس لحالة الأحرف عبر تمرير الخيار iname-:

$ find ~ -iname "foo"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo

محارف البدل Wildcards

يمكنك استخدام محارف البدل الأساسية للصدفة لتتمكن من العثور على باقي الملفات، محرف النجمة (*) يمثل أي عدد من الحروف والأرقام:

$ find ~ -iname "foo*"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt

محرف إشارة الاستفهام (?) يمثل محرفًا واحدًا:

$ find ~ -iname "foo*.???"
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt

هذه ليست صيغة التعابير النمطية، لذا في المثال السابق محرف النقطة (.) يمثل النقطة حرفيًا.

التعابير النمطية Regular expressions

يمكنك أيضا استخدام التعابير النمطية. على عكس الخيارين iname- و name- الذين يعبران عن الحالة الحساسة لحالة الأحرف والحالة الغير حساسة لحالة الأحرف على اسم الملف، الخيارين regex- و iregex- يطبقان على كامل مسار الملف، وليس فقط اسم الملف. هذا يعني أنك إذا قمت بالبحث عن foo، لن تحصل على نتيجة لأن foo لا تطابق المسار home/tux/Documents/foo/. بدل من ذلك يمكنك إما البحث عن المسار بشكل كامل، أو استخدام سلسلة محارف البدل في بداية نص البحث:

$ find ~ -iregex ".*foo"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo

إيجاد ملف تم تعديله الأسبوع الماضي

لإيجاد ملف تم تعديله الأسبوع الماضي، استخدم الخيار mtime- مع عدد سالب يعبر عن عدد الأيام السابقة:

$ find ~ -mtime -7
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt

إيجاد ملف تم تعديله خلال مدة محددة من الأيام

يمكنك دمج استخدام الخيار mtime- عدة مرات لإيجاد ملف تم تعديله خلال مدة محددة من الأيام. للمعامل للخيار mtime- الأول مرر قيمة أقرب يوم تم تعديل الملف فيه، للمعامل للخيار الثانِ مرر قيمة أكبر عدد من الأيام في الماضي. في المثال التالي سيتم البحث عن الملفات التي تم تعديلها قبل يوم واحد مضى، ولكن ليس قبل سبعة أيام:

$ find ~ -mtime +1 -mtime -7

تحديد البحث بنوع الملف

من الشائع تحديد نتيجة البحث بواسطة find حسب نوع الملف الذي ت قوم بالبحث عنه. لا يجب استخدام هذا الخيار في حال كنت لست متأكد من نوع الملف الذي تبحث عنه، لكن إذا كنت تبحث تحديدا عن ملف وليس مجلد أو العكس مجلد وليس عن ملف، فهذا الخيار سيصفي النتائج كما تحتاج تمامًا. الخيار هو type-، ومعاملاته هي أحرف رموز تمثل عدة أنواع من البيانات. الأشيع منها هو:

  • d - مجلد
  • f - ملف
  • l - وصلة رمزية
  • s - مقبس
  • p - أنبوب مسمّى (تستخدم ل FIFO)
  • b - كتلة خاصة (عادة كون قرص صلب باسم)

التالي بعض الأمثلة:

$ find ~ -type d -name "Doc*"
/home/tux/Documents
$ find ~ -type f -name "Doc*"
/home/tux/Downloads/10th-Doctor.gif
$ find /dev -type b -name "sda*"
/dev/sda
/dev/sda1

ضبط نطاق البحث

الأمر find افتراضيا يعمل بشكل تكراري، أي أنه يقوم بالبحث في المجلدات داخل المجلدات داخل المجلدات (وهكذا دواليك). يمكن للأمر أن يكون مزعجًا بعض الشيء في أنظمة الملفات الكبيرة، يمكنك عندها استخدام الخيار maxdepth- للتحكم بعدد الطبقات التي تريد الأمر find أن يقوم بالبحث داخلها في هيكلية الملفات لديك:

$ find /usr -iname "*xml" | wc -l
15588
$ find /usr -maxdepth 2 -iname "*xml" | wc -l
15

الاستنتاج

في هذا المقال غطينا الاستخدامات الأساسية فقط للأمر find. وهي أداة رائعة للبحث عن الملفات والمجلدات، وهناك الكثير من الأسباب لتعلم الأمر find فهو متواجد على أغلب الأنظمة وستواجه العديد من الحالات التي ستحتاج فيها للبحث عن ملف أو قائمة من الملفات.

ترجمة -وبتصرف- للمقال Find files and directories on Linux with the find command لصاحبه Seth Kenlon.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...