مهما كنت منظمًا في ترتيب ملفاتك ومجلداتك، ستجد نفسك في بعض الأحيان تحاول البحث عن ملف ما ولا تستطيع إيجاده. ربما تكون قد نسيت اسم الملف أو أحيانا تتذكر اسم الملف، ولكن تنسى أين قمت بحفظه. أحيانًا تحاول الوصول لملف لم تنشئه أنت أصلًا. مهما كان المأزق الذي تمرّ به، على نظام 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.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.