الجمعة، 20 مارس 2009

سطر الأوامر نظرة عن قرب أكثر 06

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

مقدمة
الكل يعلم أن الأقراص الصلبة فى تطور مستمر سواء من حيث سرعات القراءة الخاصة بها أو من حيث الأحجام ، وآخر رقم سمعته من حيث السعة بالجيجا بايت هو من شركة Hitachi وكان القرص الصلب بسعة 1024 جيحا بايت أو فيما يعادل واحد تيرا بايت ، لذلك تخيل معى شكل ذلك القرص الصلب بمحتوياته وتخيل معى أيضاً إذا كانت تلك المحتويات غير منظمة وﻻ تستطيع الوصول إلى ملف معين تريده فما الحل إذاً ؟

هنا تظهر أهمية البحث بشكل عام ، فمن خلال خاصية البحث على نظام التشغيل الذى تعمل عليه سواء كان جنو /لينوكس أو يونكس أو أى نظام تشغيل آخر تستطيع توفير الكثير من الوقت وتوفير معاناة أنت فى غنى عنها لمجرد البحث عن ملف ﻻ تتذكر أين قمت بوضعه ، لكن ما سنتحدث عنه خلال السطور القادمة إن شاء الله بخصوص أدوات البحث تلك ستكون من خلال نظام التشغيل جنو /لينوكس وﻻ يهمنا غيره ، لكن تجدر الإشارة هنا أن الأمرين locate والأمر find يختلف كلاهما فى فكرة العمل وطريقة البحث وهذا ما سوف نوضحه خلال السطور القادمة ونبدأ تلك الأوامر مع الأمر locate.


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

نبدأ الآن فى إستخدام الأمر locate فى أبسط صوره وهى كتابة الأمر متبوعا بكلمة البحث التى تريد البحث عنها بالشكل التالى :


كود PHP:
muhammad@debian:~$ locate jigdo

/root/.jigdo-lite
/usr/bin/jigdo-file
/usr/bin/jigdo-lite
/usr/bin/jigdo-mirror
/usr/share/doc-base/jigdo-mini-howto
/usr/share/doc/jigdo-file
/usr/share/doc/jigdo-file/changelog.Debian.gz
.
.
.
.
/var/
lib/dpkg/info/jigdo-file.list
/var/
lib/dpkg/info/jigdo-file.md5sums

كما تلاحظ قمنا فى البداية بكتابة الأمر locate ، ثم بعد ذلك قمنا بإتباعه بكملة البحث التى تريد البحث عنها والتى كانت jigdo وأخيراً كانت نتيجة الأمر بالشكل السابق وهى كل الملفات التى احتوت على الكلمة jigdo ، لكن ألم تلاحظ شيئاً آخر ؟؟

قد تبادر بالسؤال وتوجهه لى بصيغة أخرى أى شىء ؟؟

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

عملية البحث السابقة كانت تتم بشكل عادى دون حدوث أية مشاكل ، لكن ماذا لو أردنا نحن رؤية تلك المشاكل ؟؟

قد يقول البعض هل أنت من هواة المشاكل ؟؟ نعم !! أنا أحب المشاكل بشكل قد ﻻ تتخيله لأنها تساعدنى على تعلم الكثير والكثير وقد ﻻ تصدق أننى أجيانا أجبر نفسى على الوقوع فى مشاكل لا أفقه عنها شيئا لمجرد تعلم بعض الأمور الجديدة !! (أعلم أن البعض قد يتهمنى بالجنون لكن لا يهمنى رأيهم ! P


إذاً لسان حالك يقول الآن : ماذا تقصد بتلك المشاكل ؟؟ أو ماهو الداعى لخلق مشاكل قد نكون فى غنى عنها ؟؟

حينما نتعرف على الأمر slocate ستعرف ماهو قصدى بخلق المشاكل أو ما الذى دعانى إلى فعل ذلك ، لكن قبل أن نتعرف أكثر على slocate ألمح بعض التساؤلات فى ذهنك بنظرة غاضبة تندفع متسائلاً " هل هناك فرق بين locate و slocate ؟ "

قبل أن أجيب على ذلك التساؤل قم بتحميل حزمة الأمر slocate إذا كنت أحد مستخدمى توزيعة Debian Gnu/Linux بالشكل التالى :

كود PHP:
debian:~# apt-get install slocate

الآن قم بإجراء عملية البحث السابقة عن الملف slocate.db كما ذكرنا والتى كانت بالشكل التالى :

كود PHP:
muhammad@debian:~$ locate slocate.db

الآن ماهى نتيجة عملية البحث التى تظهر لديك فى محاكى الطرفية هل هى مماثلة للنتيجة السابقة أم ماذا ؟؟ أشك فى ذلك !!

بالطبع لم تظهر أى نتيجة لعملية البحث ، ذلك أن المستخدم "muhammad" ليس له صلاحية عرض الملف السابق أﻻ وهو slocate.db ، وسيقوم محاكى الطرفية بالرجوع مرة أخرى إلى وضع الإستعداد لتلقى أمر آخر .


بالتأكيد الآن تريد معرفة عدم ظهور نتيجة لعملية البحث مع العلم أنك قمت بكتابة الأمر locate بدون أى خطأ إملائى أليس كذلك ؟؟


للإجابة على ذلك التساؤل سنقوم أوﻻً ببسط بعض الأمور التى تخص الأمر slocate ، الأمر slocate يرمز إلى secure locate ، وتكمن أهمية ذلك الأمر فى الفائدة التى تحصل عليها إذا كنت مدير أحد أنظمة تشغيل جنو /لينوكس فى منع بعض المستخدمين من البحث داخل مجلدات وملفات تخص مستخدمين آخرين على النظام ما لم يتم السماح لهم بذلك ، فمثلا يريد المستخدم " muhammad" البحث عن الملف السابق slocate.db وذلك الملف قد يكون خاص بالمستخدم "root" فحينها لن يتمكن المستخدم "muhammad" من رؤية نتيجة لعملية البحث وظهور نتائج لتلك العملية مالم يتم منح التصاريح الخاصة على ذلك الملف للقيام بذلك .

الآن لكى نتمكن من إجراء تلك عملية البحث بشكل طبيعى سنقوم بإستخدام حساب المستخدم root عن طريق الأمر - su :

كود PHP:
muhammad@debian:~$ su -
Password:
debian:~#

الآن قم بكتابة الأمر locate مرة أخرى متبوعاً بإسم الملف slocate.db كما يلى :

كود PHP:
debian:~# locate slocate.db
/var/lib/slocate/slocate.db

كما تلاحظ ظهور نتيجة لعملية البحث بعد إستخدام حساب المستخدم "root" ، أيضا هناك مسألة مهمة أخرى ينبغى الإشارة إليها بخصوص الأمر slocate أﻻ وهى :

عند وجود كلا الأمرين الأمر locate والأمر slocate على نفس التوزيعة فحينها أسبقية التنفيذ ستكون للأمر slocate أوﻻً ثم بعد ذلك سيتم تنفيذ الأمر locate ولكى تتحق من ذلك قم بتنفيذ الأمر التالى :

كود PHP:
muhammad@debian:~$ ls -l /usr/bin/locate

root root
/usr/bin/locate -> slocate

ملحوظة : النتيجة السابقة ناتجة من عمل soft link للأمر locate على المسار usr/bin/locate/ مع الأمر slocate والعلامة <- تدل على ذلك .


بعد أن استعرضنا بعض المفاهيم الأساسية التى تخص الأمر locate وكيفية تنفيذ عملية البحث من خلاله سنتطرق الآن إلى بعض الخيارات التى يمكن أن تأتى مع ذلك الأمر لتُكسبه بعض الميزات الإضافية وعمل مهام أكثر .


locate -i
خلال السطور السابقة قمنا بإستخدام الأمر locate لإجراء عملية البحث ولكن لم نكن لنهتم كثير هل إسم الملف يوجد به حروف صغيرة أى lower case أو حروف كبيرة أى Upper case ، لذلك بدمج الخيار i- مع الأمر locate سنتجنب تلك المشكلة تماماً لأنه كما تعلم أن نظام التشغيل جنو/لينوكس حساس تجاه الحروف الكبيرة والصغيرة فالكلمة mysql تختلف عن MySQL تختلف عن MySql وهكذا ، ولذا عند وضع i- مع locate لن تحدث مشاكل بسبب تلك العملية ونأخد مثالاً عملياً على ذلك :

كود PHP:
muhammad@debian:~$ locate -i mysql.txt

/home/muhammad/MysqL.txt
/home/muhammad/mysql.txt
/home/muhammad/MySQL.txt

بالفعل تم إهمال حساسية الحروف خلال عملية البحث وظهرت النتيجة لكل الملفات التى تحت إسم mysql.txt على إختلاف حالة الأحرف فيها .


locate -n
الملف السابق الذى قمنا ببناء عملية البحث عليه كان الملف mysql.txt ، وكما رأينا أن نتيجة البحث تضمنت ثلاث نتائج فقط وبالتالى لم يكن الأمر صعباً فى تحديد أين من الملفات الثلاث نريد أو على أي المسارات توجد ، لكن ماذا لو كانت نتيجة البحث كبيرة بالشكل الذى قد يجعلها آلاف النتائج لملف واحد هل ستسطيع حينها معرفة مرادك من خلال نتائج البحث ؟ أظن أن الأمر سيكون صعبا لذا يوفر الخيار n- عند دمجه مع الأمر locate إمكانية تحديد عدد نتائج عملية البحث التى سوف تظهر ولكى يصل إليك ما أود قوله نأخد المثال التالى :


مثال : تريد أول ثلاث نتائج لعملية البحث عن الملف jigdo كيف ستكون صيغة الأمر locate مع الخيار n- ؟؟

كود PHP:
muhammad@debian:~$ locate -n 3 jigdo

/var/lib/dpkg/info/jigdo-file.postinst
/var/lib/dpkg/info/jigdo-file.list
/var/
lib/dpkg/info/jigdo-file.md5sums

كما تلاحظ قمنا بكتابة الأمر locate أوﻻ ً ثم بعد ذلك أتبعناه بالخيار n- ثم بعد ذلك قمنا بتحديد العدد لنتائج عملية البحث ثم أخيراً إسم الملف الذى نود البحث عنه ، وبالطبع تستطيع تغيير الرقم 3 إلى أى رقم تريده للنتائج الخارجة من عملية البحث .



الأمر updatedb

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

الأمر الأول : هو عدم وجود الملف الذى يتم البحث عنه على نظام التشغيل .

الأمر الثانى : هو أن قاعدة البيانات الخاصة بالأمر لم يحدث لها تحديث بعد .


لذا دور الأمر updatedb هنا هو تحديث قاعدة البيانات التى يعتمد عليها الأمر locate بشكل يدوى ، لكن ينبغى الإشارة إلى أمر مهم أن الأمر locate يقوم بتحديث تلك القاعدة بشكل يومى لكن الغرض من تحديث القاعدة بشكل يدوى هو العثور على ملفات قد قمنا بإضافتها قبل بدء عملية التحديث التى تحدث بشكل تلقائى .

الآن نريد تنفيذ عملية تحديث قاعدة البيانات التى يعتمد عليها الأمر locate بشكل يدوى كيف لنا فعل ذلك ؟؟

الأمر بسيط جدا قم بالدخول بحساب المستخدم root ونفذ الأمر على صورته البسيطة هكذا :

كود PHP:
debian:~# updatedb

بعد ذلك قم بالضغط على زر Enter وانتظر قليلا حتى يفرغ الأمر من تحديث قاعدة البيانات .


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


تلميح : تستطيع معرفة الوقت الذى استغرقته عملية التحديث من خلال الأمر time وتكون الصيغة للأمرين معاً بالشكل التالى :

كود PHP:
debian:~# time updatedb

وتكون النتيجة بالشكل التالى :

كود PHP:
debian:~# time updatedb

real 1m14.912s
user 0m0.144s
sys 0m0.428s

الآن قد يتساءل البعض ماهو المسار الذى يحتوى قاعدة البيانات الخاصة بالأمر locate وكيف لى بعرض محتويات تلك القاعدة ؟؟

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

كود PHP:
debian:~# strings /var/lib/slocate/slocate.db | less

طبعا توجد الكثير من الخيارات التى تأتى مدمجة مع الأمر locate وتستطيع معرفة المزيد بإستخدام الأمر man بالشكل التالى :

كود PHP:
debian:~# man locate

ليست هناك تعليقات:

إرسال تعليق