كيفية اجتياز شجرة دليل على نظام Linux
نشرت: 2022-07-21
تتيح لك الدلائل على Linux تجميع الملفات في مجموعات متميزة ومنفصلة. الجانب السلبي هو أنه يصبح الانتقال من دليل إلى دليل لأداء مهمة متكررة أمرًا شاقًا. إليك كيفية أتمتة ذلك.
كل شيء عن الدلائل
من المحتمل أن يكون الأمر الأول الذي تتعلمه عند تقديمك لنظام Linux هو ls
، لكن cd
لن يكون بعيدًا عن ذلك. يعد فهم الدلائل وكيفية التنقل بينها ، وخاصة الدلائل الفرعية المتداخلة ، جزءًا أساسيًا من فهم كيفية تنظيم 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:" {} \؛
يمكنك أن ترى بالترتيب الذي تم سرد الدلائل به ، وكيف يتقدم البحث عبر الشجرة. من خلال مقارنة الإخراج من أمر tree
بإخراج find
عن سطر واحد ، سترى كيفية find
عن كل دليل ودليل فرعي بدوره حتى يصل إلى دليل بدون أدلة فرعية. ثم ينتقل إلى مستوى أعلى ويستأنف البحث عند هذا المستوى.
إليك كيفية صنع الأمر.
- find : أمر
find
. - work : الدليل لبدء البحث. يمكن أن يكون هذا مسارًا.
- -النوع د : نبحث عن أدلة.
- -execdir : سنقوم بتنفيذ أمر في كل دليل نعثر عليه.
- صدى "In:" {} : هذا هو الأمر. ، نحن ببساطة نكرر اسم الدليل إلى نافذة المحطة الطرفية. يحمل "{}" اسم الدليل الحالي.
- \ ؛ : هذه فاصلة منقوطة تستخدم لإنهاء الأمر. نحتاج إلى الهروب منها باستخدام الشرطة المائلة للخلف حتى لا يفسرها Bash بشكل مباشر.
مع تغيير طفيف ، يمكننا جعل الأمر find يُرجع الملفات التي تتطابق مع دليل البحث. نحتاج إلى تضمين خيار -name ودليل بحث. في هذا المثال ، نبحث عن الملفات النصية التي تطابق "* .txt" ، وتردد اسمها في النافذة الطرفية.

اعثر على work -name "* .txt" -type f -execdir echo "Found:" {} \؛
يعتمد ما إذا كنت تبحث عن ملفات أو أدلة على ما تريد تحقيقه. لتشغيل أمر داخل كل دليل ، استخدم -type d
. لتشغيل أمر على كل ملف مطابق ، استخدم -type f
.
يقوم هذا الأمر بحساب الأسطر في جميع الملفات النصية في دليل البداية والأدلة الفرعية.
اعثر على العمل -name "* .txt" -type f -execdir wc -l {} \؛
ذات صلة: كيفية استخدام أمر البحث في 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
يقوم البرنامج النصي بتعيين خيارين من خيارات shell ، dotglob
و nullglob
.
يعني إعداد dotglob
أسماء الملفات والدليل التي تبدأ بنقطة “ .
"عند توسيع مصطلحات بحث حرف البدل. هذا يعني بشكل فعال أننا نقوم بتضمين الملفات والأدلة المخفية في نتائج البحث الخاصة بنا.
يعني الإعداد nullglob
أن أنماط البحث التي لا تجد أي نتائج تعامل كسلسلة فارغة أو فارغة. لا يقومون افتراضيًا بمصطلح البحث نفسه. بمعنى آخر ، إذا كنا نبحث عن كل شيء في دليل ما باستخدام حرف البدل النجمة " *
" ، ولكن لا توجد نتائج ، فسنستلم سلسلة فارغة بدلاً من سلسلة تحتوي على علامة النجمة. هذا يمنع البرنامج النصي من محاولة فتح دليل يسمى "*" عن غير قصد ، أو التعامل مع "*" كاسم ملف.
بعد ذلك ، تحدد وظيفة تسمى recursive
. هذا هو المكان الذي تحدث فيه الأشياء المثيرة للاهتمام.
تم التصريح عن متغيرين ، يسمى current_dir
و dir_or_file
. هذه متغيرات محلية ، ولا يمكن الرجوع إليها إلا داخل الوظيفة.
يتم أيضًا استخدام متغير يسمى $1
داخل الدالة. هذه هي المعلمة الأولى (والوحيدة) التي يتم تمريرها إلى الوظيفة عند استدعائها.
يستخدم البرنامج النصي حلقتين 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 العمل
هذه المرة ، يتم تطبيق الأوامر على الدلائل من أعمق المستويات أولاً ، والعمل على نسخ فروع الشجرة احتياطيًا. أخيرًا ، تمت معالجة الدليل الذي تم تمريره كمعامل إلى البرنامج النصي.
إذا كان من المهم معالجة أدلة أعمق أولاً ، فهذه هي الطريقة التي يمكنك القيام بها.
العودية أمر غريب
إنه يشبه الاتصال بنفسك على هاتفك ، وترك رسالة لنفسك لتخبرها عندما تقابلك في المرة القادمة - بشكل متكرر.
قد يستغرق الأمر بعض الجهد قبل أن تدرك فوائدها ، ولكن عندما تفعل ذلك سترى أنها طريقة برمجية أنيقة لمعالجة المشكلات الصعبة.
ذات صلة: ما هو العودية في البرمجة ، وكيف تستخدمه؟