لماذا لا ترجع find النتائج المتوقعة؟ إليك كيفية إصلاح ذلك

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

المشكلة: find لا تعمل كما هو متوقع

اعتبر هذا الأمر الذي قد تكون قد جربته:

$ find /usr -name *.sh

هذا الأمر يهدف إلى البحث عن جميع الملفات ذات امتداد .sh في الدليل /usr. ومع ذلك، إذا وجدت أن النتائج لا تظهر، فقد تتساءل، لماذا لا تعمل find؟

أنت تعلم أن النصوص موجودة؛ على سبيل المثال، عندما تقوم بتشغيل:

$ ls /usr/local/lib/*.sh

يمكنك رؤية ملفات مثل tclConfig.sh و tkConfig.sh. إذن، ما الذي يحدث بشكل خاطئ مع الأمر find الخاص بك؟

فهم القضية

المشكلة الرئيسية هنا هي كيفية تفسير قشرة الأوامر لرمز البدل *.sh. على وجه الخصوص، إذا كانت هناك أي ملفات في الدليل الحالي الخاص بك تتطابق مع *.sh، فإن القشرة توسع هذا الرمز قبل أن يحصل find على فرصة للتصرف. يمكن أن يؤدي ذلك إلى سلوك غير متوقع:

  1. توسيع رمز البدل

    • إذا كانت هناك ملفات .sh في الدليل الحالي الخاص بك، على سبيل المثال، tkConfig.sh، فسيؤدي كتابة find /usr -name *.sh إلى توسيع هذا إلى find /usr -name tkConfig.sh، مما يحد فعليًا من بحثك إلى تلك الملفات فقط.
  2. أخطاء في الصياغة

    • إذا تطابقت عدة ملفات، قد يثير find خطأ في صياغة بسبب الحجج الغامضة:
      find: bad option tkConfig.sh
      

الحل 1: اقتباس رمز البدل

لمنع القشرة من توسيع رمز البدل قبل تمريره إلى find، يمكنك اقتباس حرف رمز البدل:

  • إما استخدام الاقتباسات المزدوجة:
    $ find /usr -name "*.sh"
    
  • أو استخدام الاقتباسات المفردة:
    $ find /usr -name '*.sh'
    

من خلال اقتباس *.sh، فإنك توجه القشرة لتمريرها كما هي إلى find، مما يمكنه من البحث عن جميع ملفات .sh في الدليل المحدد.

الحل 2: متابعة الروابط الرمزية

سبب آخر محتمل لعدم عمل find كما هو متوقع هو وجود روابط رمزية في الدليل /usr أو الأدلة الفرعية الخاصة به. بشكل افتراضي، لا يتبع find الروابط الرمزية. إذا كنت تشك في أن هذا قد يكون هو الحال، يمكنك استخدام خيار -follow:

$ find /usr -follow -name '*.sh'

يسمح لك هذا الأمر لـ find بالتنقل عبر الروابط الرمزية والبحث عن الملفات المطلوبة.

الخلاصة

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

بحث سعيد!

الآن أنت مستعد لمواجهة الأمر find بثقة! إذا كانت لديك أي أسئلة أو مشاكل أخرى، فلا تتردد في تركها في التعليقات أدناه.