كيفية اجتياز شجرة دليل على نظام Linux

نشرت: 2022-07-21
كمبيوتر محمول Linux يعرض موجه bash
fatmawati achmad zaenuri / Shutterstock.com

تتيح لك الدلائل على Linux تجميع الملفات في مجموعات متميزة ومنفصلة. الجانب السلبي هو أنه يصبح الانتقال من دليل إلى دليل لأداء مهمة متكررة أمرًا شاقًا. إليك كيفية أتمتة ذلك.

كل شيء عن الدلائل

من المحتمل أن يكون الأمر الأول الذي تتعلمه عند تقديمك لنظام Linux هو ls ، لكن cd لن يكون بعيدًا عن ذلك. يعد فهم الدلائل وكيفية التنقل بينها ، وخاصة الدلائل الفرعية المتداخلة ، جزءًا أساسيًا من فهم كيفية تنظيم Linux لنفسه ، وكيف يمكنك تنظيم عملك الخاص في ملفات ، وأدلة ، وأدلة فرعية.

شرح هيكل دليل Linux
ذات الصلة شرح هيكل دليل Linux

يعد استيعاب مفهوم شجرة الدلائل - وكيفية التنقل بينها - أحد المعالم الصغيرة العديدة التي تمر بها وأنت تتعرف على المناظر الطبيعية لنظام Linux. يؤدي استخدام cd مع مسار إلى نقلك إلى ذلك الدليل. الاختصارات مثل cd ~ أو cd من تلقاء نفسها تعيدك إلى الدليل الرئيسي الخاص بك ، و cd .. ينقلك إلى مستوى أعلى في شجرة الدليل. بسيط.

ومع ذلك ، لا توجد وسيلة بسيطة بنفس القدر لتشغيل أمر في جميع أدلة شجرة الدليل. هناك طرق مختلفة يمكننا من خلالها تحقيق هذه الوظيفة ، ولكن لا يوجد أمر Linux قياسي مخصص لهذا الغرض.

تحتوي بعض الأوامر ، مثل ls ، على خيارات سطر أوامر تجبرها على العمل بشكل متكرر ، مما يعني أنها تبدأ في دليل واحد وتعمل بشكل منهجي من خلال شجرة الدليل بالكامل أسفل ذلك الدليل. بالنسبة إلى ls ، يكون الخيار -R (تكراري).

إذا كنت بحاجة إلى استخدام أمر لا يدعم العودية ، فيجب عليك توفير الوظيفة العودية بنفسك. إليك كيفية القيام بذلك.

ذات صلة: 37 أمرًا مهمًا من أوامر Linux يجب أن تعرفه

قيادة الشجرة

لن يساعدنا أمر tree في المهمة المطروحة ، ولكنه يجعل من السهل رؤية بنية شجرة الدليل. يرسم الشجرة في نافذة طرفية حتى نتمكن من الحصول على نظرة عامة فورية على الدلائل والأدلة الفرعية التي تشكل شجرة الدليل ، ومواقعها النسبية في الشجرة.

ستحتاج إلى تثبيت tree .

على Ubuntu ، تحتاج إلى كتابة:

 sudo apt تثبيت الشجرة 

تثبيت الشجرة على أوبونتو

في Fedora ، استخدم:

 sudo dnf تثبيت الشجرة 

تركيب شجرة في فيدورا

في Manjaro ، الأمر هو:

 sudo pacman -Sy Tree 

تركيب الشجرة على مانجارو

يؤدي استخدام tree بدون معلمات إلى رسم الشجرة أسفل الدليل الحالي.

 شجرة 

تشغيل الشجرة في الدليل الحالي

يمكنك تمرير مسار إلى tree في سطر الأوامر.

 عمل الشجرة 

تشغيل الشجرة على دليل محدد

يستبعد الخيار -d (الدلائل) الملفات ويعرض الدلائل فقط.

 عمل الشجرة 

تشغيل الشجرة وإظهار الدلائل فقط

هذه هي الطريقة الأكثر ملاءمة للحصول على رؤية واضحة لهيكل شجرة الدليل. شجرة الدليل الموضحة هنا هي المستخدمة في الأمثلة التالية. هناك خمسة ملفات نصية وثمانية أدلة.

لا تقم بتحليل الإخراج من ls إلى الدلائل العابرة

قد تكون فكرتك الأولى ، إذا كان بإمكان ls اجتياز شجرة دليل بشكل متكرر ، فلماذا لا تستخدم ls للقيام بذلك وتحويل الإخراج إلى بعض الأوامر الأخرى التي تحلل الدلائل وتنفذ بعض الإجراءات؟

يعتبر تحليل ناتج ls ممارسة سيئة. نظرًا لقدرة Linux على إنشاء أسماء ملفات ودليل تحتوي على جميع أنواع الأحرف الغريبة ، يصبح من الصعب جدًا إنشاء محلل عام وصحيح عالميًا.

قد لا تقوم أبدًا بإنشاء اسم دليل عن قصد بهذا الشكل المنافي للعقل ، ولكن قد يحدث خطأ في نص برمجي أو تطبيق ما.

اسم دليل غريب

يعد تحليل أسماء الملفات والدليل المشروعة ولكن التي لا يتم اعتبارها بشكل جيد عرضة للخطأ. هناك طرق أخرى يمكننا استخدامها أكثر أمانًا وقوة من الاعتماد على تفسير مخرجات ls .

باستخدام أمر البحث

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

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

 اعثر على نوع العمل d -execdir echo "In:" {} \؛ 

باستخدام الأمر find للعثور على الدلائل بشكل متكرر

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

إليك كيفية صنع الأمر.

  • find : أمر find .
  • work : الدليل لبدء البحث. يمكن أن يكون هذا مسارًا.
  • -النوع د : نبحث عن أدلة.
  • -execdir : سنقوم بتنفيذ أمر في كل دليل نعثر عليه.
  • صدى "In:" {} : هذا هو الأمر. ، نحن ببساطة نكرر اسم الدليل إلى نافذة المحطة الطرفية. يحمل "{}" اسم الدليل الحالي.
  • \ ؛ : هذه فاصلة منقوطة تستخدم لإنهاء الأمر. نحتاج إلى الهروب منها باستخدام الشرطة المائلة للخلف حتى لا يفسرها Bash بشكل مباشر.

مع تغيير طفيف ، يمكننا جعل الأمر find يُرجع الملفات التي تتطابق مع دليل البحث. نحتاج إلى تضمين خيار -name ودليل بحث. في هذا المثال ، نبحث عن الملفات النصية التي تطابق "* .txt" ، وتردد اسمها في النافذة الطرفية.

 اعثر على work -name "* .txt" -type f -execdir echo "Found:" {} \؛ 

باستخدام الأمر find للعثور على الملفات بشكل متكرر

يعتمد ما إذا كنت تبحث عن ملفات أو أدلة على ما تريد تحقيقه. لتشغيل أمر داخل كل دليل ، استخدم -type d . لتشغيل أمر على كل ملف مطابق ، استخدم -type f .

يقوم هذا الأمر بحساب الأسطر في جميع الملفات النصية في دليل البداية والأدلة الفرعية.

 اعثر على العمل -name "* .txt" -type f -execdir wc -l {} \؛ 

استخدام find مع الأمر wc

ذات صلة: كيفية استخدام أمر البحث في Linux

اجتياز أشجار الدليل باستخدام برنامج نصي

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

 #! / بن / باش

shopt -s dotglob nullglob

دالة تكرارية {

  الحالي المحلي dir_or_file

  لـ current_dir بـ 1 دولار ؛ فعل

    صدى "Directory command for:" $ current_dir

    لـ dir_or_file في "$ current_dir" / * ؛ فعل

      إذا [[-d $ dir_or_file]] ؛ ومن بعد
        متكرر "dir_or_file $"
      آخر
        wc $ dir_or_file
      فاي
    فعله
  فعله
}

متكرر "$ 1"

انسخ النص في محرر واحفظه باسم "recurse.sh" ، ثم استخدم الأمر chmod لجعله قابلاً للتنفيذ.

 chmod + x recurse.sh 

جعل البرنامج النصي recurse.sh قابلاً للتنفيذ

يقوم البرنامج النصي بتعيين خيارين من خيارات shell ، dotglob و nullglob .

يعني إعداد dotglob أسماء الملفات والدليل التي تبدأ بنقطة “ . "عند توسيع مصطلحات بحث حرف البدل. هذا يعني بشكل فعال أننا نقوم بتضمين الملفات والأدلة المخفية في نتائج البحث الخاصة بنا.

يعني الإعداد nullglob أن أنماط البحث التي لا تجد أي نتائج تعامل كسلسلة فارغة أو فارغة. لا يقومون افتراضيًا بمصطلح البحث نفسه. بمعنى آخر ، إذا كنا نبحث عن كل شيء في دليل ما باستخدام حرف البدل النجمة " * " ، ولكن لا توجد نتائج ، فسنستلم سلسلة فارغة بدلاً من سلسلة تحتوي على علامة النجمة. هذا يمنع البرنامج النصي من محاولة فتح دليل يسمى "*" عن غير قصد ، أو التعامل مع "*" كاسم ملف.

بعد ذلك ، تحدد وظيفة تسمى recursive . هذا هو المكان الذي تحدث فيه الأشياء المثيرة للاهتمام.

تم التصريح عن متغيرين ، يسمى current_dir و dir_or_file . هذه متغيرات محلية ، ولا يمكن الرجوع إليها إلا داخل الوظيفة.

يتم أيضًا استخدام متغير يسمى $1 داخل الدالة. هذه هي المعلمة الأولى (والوحيدة) التي يتم تمريرها إلى الوظيفة عند استدعائها.

التمهيدي: Bash Loops: for و while و until
التمهيدي ذو الصلة : Bash Loops: for و while و until

يستخدم البرنامج النصي حلقتين for ، إحداهما متداخلة داخل الأخرى. الحلقة الأولى (الخارجية) تستخدم for .

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

الشيء الثاني الذي تقوم به حلقة for الخارجية هو فحص كل كائنات نظام الملفات التي يمكنها العثور عليها — والتي ستكون إما ملفات أو أدلة. هذا هو الغرض من حلقة for الداخلية. في المقابل ، يتم تمرير كل اسم ملف أو دليل إلى متغير dir_or_file .

ثم يتم اختبار المتغير dir_or_file في عبارة if لمعرفة ما إذا كان دليلًا.

  • إذا كان الأمر كذلك ، فإن الوظيفة تستدعي نفسها وتمرر اسم الدليل كمعامل.
  • إذا لم يكن المتغير dir_or_file دليلاً ، فيجب أن يكون ملفًا. يمكن استدعاء أي أوامر ترغب في تطبيقها على الملف من جملة else في عبارة if . يمكنك أيضًا استدعاء وظيفة أخرى داخل نفس البرنامج النصي.

يستدعي السطر الأخير في البرنامج النصي الوظيفة recursive ويمرر في أول معلمة سطر الأوامر $1 كدليل بدء للبحث فيه. هذا هو ما يطلق العملية برمتها.

لنقم بتشغيل البرنامج النصي.

 ./recurse.sh العمل 

معالجة الدلائل من الضحلة إلى الأعمق

يتم اجتياز الدلائل ، وتتم الإشارة إلى النقطة في البرنامج النصي حيث سيتم تشغيل الأمر في كل دليل بواسطة "أمر الدليل لـ:". الملفات التي تم العثور عليها يتم تشغيل الأمر wc عليها لحساب عدد الأسطر والكلمات والأحرف.

أول دليل تمت معالجته هو "work" ، متبوعًا بكل فرع دليل متداخل في الشجرة.

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

دعنا ننقل سطر "أمر الدليل لـ:" إلى ما بعد done من حلقة for الداخلية.

 #! / بن / باش

shopt -s dotglob nullglob

دالة تكرارية {

  الحالي المحلي dir_or_file

  لـ current_dir بـ 1 دولار ؛ فعل

    لـ dir_or_file في "$ current_dir" / * ؛ فعل

      إذا [[-d $ dir_or_file]] ؛ ومن بعد
        متكرر "dir_or_file $"
      آخر
        wc $ dir_or_file
      فاي

    فعله

    صدى "Directory command for:" $ current_dir

  فعله
}

متكرر "$ 1"

الآن سنقوم بتشغيل البرنامج النصي مرة أخرى.

 ./recurse.sh العمل 

معالجة الدلائل من أعمق إلى أعمق

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

إذا كان من المهم معالجة أدلة أعمق أولاً ، فهذه هي الطريقة التي يمكنك القيام بها.

العودية أمر غريب

إنه يشبه الاتصال بنفسك على هاتفك ، وترك رسالة لنفسك لتخبرها عندما تقابلك في المرة القادمة - بشكل متكرر.

قد يستغرق الأمر بعض الجهد قبل أن تدرك فوائدها ، ولكن عندما تفعل ذلك سترى أنها طريقة برمجية أنيقة لمعالجة المشكلات الصعبة.

ذات صلة: ما هو العودية في البرمجة ، وكيف تستخدمه؟