بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
بعض الشرح عن برنامج find .
الأفضل تجربت نقل الأوامر المذكروة في المنشور للترمينال لأن التنسيق سيء على blogger .
كيف ممكن البحث في مجلد ما عن كل الملفات في المجلد نفسه وفي المجلدات الفرعية داخله ؟الجواب من خلال الامر في الأسفل .
find Downloads/ -type f
اولا امر find ويعني بحث ثم طلبت البحث في مجلد إسمه Downloads ثم إخترت النوع f إختصار لي File أي أريد البحث عن الملفات .
كيف ممكن البحث في مجلد ما عن كل الملفات التي تنتهي بشيء محدد مثلا تنتهي بالاحقة py.؟الجواب من خلال الامر في الأسفل .
find Downloads/ -type f -iname "*.py"
الذي أضفناه هنا هو iname- ثم إستخدمت خاصية التوسعة حيث ستقوم النجمة بتمثيل أي شيء أي أنا أقول له أريد أي شيء ينتهي ب py. بالمناسبة ممكن من خلال * وغيرها القيام بالكثير من اﻷمور وممكن وضع النجمة بأي مكان مثال في الأسفل النجمة تمثل أي شيء في نهابة إسم المجلد نلاحظ إستبدلت حرف f بحرف d إختصار ل directory أي أريد كل مجلد يبدأ بحرف m بالمناسبة ممكن أيضا إستخدام name- لاكن سيكون البحث حساس لحالة الأحرف على عكس iname- .
find Downloads/ -type d -iname "m*"
بعد ان عرفنا كيف نحصل على أسماء الملفات التي نريدها هل ممكن معالجتها بشيء مثل نسخها لمكان أخر أو البحث فيها من خلال أمر grep ؟ الجواب نعم مثال في الامر في الأسفل .
find Downloads/ -type f -iname "*.py" -exec grep -il 'arfedora' {} +
بعد الحصول على الملفات التي أريدها طلبت من خلال exec- تشغيل أمر grep للبحث عن كلمة arfedora داخل هذه الملفات وخيار i خاص بأمر grep لتجاهل حالة الأحرف أثناء البحث و خيار l وهو أيضا خاصة بgrep وعمله عرض إسم الملف الذي يحتوي كلمة arfedora ,بالنسبة ل {} تمثل أسماء الملفات التي يجدها find .
امر أخر ذات المبدأ لاكن هناك إختلاف بكيفية التنفيذ.
find . -type f -iname "*.py" -exec echo 10000 {} ';'
اولا ملاحظة النقطة بعد أمر find يمثل المجلد الموجود فيه أنت حاليا وبدل امر grep طلبت طباعة رقم 10000 والسبب أني أريد أن أوضح شيء ,نلاحظ في الأمر في الأعلى سيتم عند كل إجاد إسم ملف تنفيذ أمر echo لطباعة رقم 10000 وسيتم طباعة ما يعوضه find بدل {} شيء كما في الأسفل , بالمناسبة أحطنا علامة ; لأنها تعني شيء اخر للشل اي حتى لا تعتبر أمر خاص بالشل وتتداخل الامور .
echo 10000 myfile1.py
echo 10000 myfile2.py
echo 10000 myfile3.py
echo 10000 myfile4.py
أما الامر في الأسفل الذي إستخدمناه سابقا أي علامة الزائد + في أخره سيقوم find بتجميع أسماء هذه الملفات وعندما ينتهي سينفذ عليهم ولمرة واحدة أمر echo أي شيء كالذي في الأسفل .
find . -type f -iname "*.py" -exec echo 10000 {} +
echo 10000 myfile1.py myfile2.py myfile3.py myfile4.py
بما أن {} تعوض بما يجده find لنفترص أريد نسخ ما يجده لمجلد أخر موجود مسبقا إسمه myfolder على أن لا يكون موجود بذات المجلد الذي نبحث فيه , الامر في الأسفل يقوم بالأمر .
find Documents/ -type f -iname "*.py" -exec cp {} myfolder ';'
أخيرا لمزيد من المعلومات نكتب man find لانه برنامج فيه الكثير من الممبزات مثل البحث حسب الوقت والصلاحيات والحجم وإمكانية القيام بإجراءات على حسب توفر بعض الشروط شيء مثل or and في لغات البرمجة والكثبر من الأمور في الحقيقة لا تستغرب إذا وجدت كتاب يشرح عنه فقط .