1

أمر find للبحث عن الملفات على لينكس

السلام عليكم ورحمة الله.

تدوينة بنكهة رمضانية، وجبة دسمة بانتظاركم، تقبل الله من الجميع 🙂

تحدّثنا في منشور سابق عن أمر locate للبحث عن الملفات في غنو/لينوكس بطريقة بسيطة وغير معقّدة. اليوم سنتطرق إلى أمر find ذي الإمكانيات الأكثر.

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

نبدأ أولا بعرض آلية عمل أمر find على أن نوضِّحها أكثر بأمثلة بعد الشرح النظري.

طريقة عمل  أمر find

يتوفر الأمر find على أنظمة غنو/لينوكس وأنظمة يونكس ويستخدم على النحو التالي:

find where-to-look criteria what-to-do

حيثُ where-to-look تعني المكان الذي سيجري فيه البحث (مسار المجلد)، في حال عدم تحديد مسار فإن البحث يكون في المجلد حيث نُفِّذ الأمر؛ و criteria هي معيار أو معايير البحث؛ أما what-to-do فترمز إلى العملية التي ستُنفذ على نتائج البحث. في أنظمة غنو/لينوكس فإن كلا من معطيات الأمر find السابق ذكرها تتوفر على قيمة افتراضية، إذا لم يُحدّد معيار البحث فسيكون عن جميع الملفات في مجلد البحث. وفي حالة عدم تحديد العملية التي تُنفذ على نتائج البحث فإن القيمة الافتراضية هي إظهار النتائج.

من هذا المنطلق فإن تنفيذ الأمر find بدون معطيات سينتج عنه إظهار كل الملفات الموجودة في مجلد العمل والمجلدات المتفرعة عنه حيثُ إن أمر find يعمل بصيغة تكرارية Recursive (يبحث داخل مجلد وكل المجلدات المتفرعة عنه والمجلدات المتفرعة عنها وهكذا حتى لا يبقى أي مجلد فرعي).

توجد عدة معايير يكون البحث وفقا لها وأهمها:

  • الاسم name- للبحث عن ملف باسمه.
  • النوع type- للبحث حسب نوع الملف (مجلد أو ملف عادي مثلا).
  • الحجم size- للبحث عن الملفات حسب الحجم.
  • تاريخ آخر وصول للملف atime-.
  • تاريخ آخر تعديل على الملف mtime-.
  • تاريخ آخر تغيير على الملفّ ctime-.

ملحوظة: يوجد فرق بين ctime وmtime. سنتطرّق له في هذه التّدوينة.

يمكن استخدام أكثر من معيار للبحث في نفس الأمر  عبر تحديد روابط منطقية بين معايير البحث:

  • عند وضع علامة تعجب قبل معيار البحث هكذا criteria! فإنه يُشترط في نتائج البحث ألا ينطبق عليها المعيار criteria (علامة التعجب للدلالة على النقيض أو العكس).
  • عند وضع معايير البحث بشكل criteria1 criteria2 فإنه يجب توفر الشرطين criteria1 و criteria2 معا في نتيجة البحث.
  • عند وضع معايير البحث بشكل criteria1 -o criteria2 فإنه يكفي توفر أحد الشرطين criteria1 و criteria2 في نتيجة البحث.

توجد أولوية بين الروابط المنطقية (أيها يُطبَّق أولا). في حال استخدام أكثر من رابط فإن ترتيب تطبيقها يكون على النحو المذكور أعلاه (على الترتيب: النفي، توفر الشرطين ثم توفر أحد الشرطين). لتغيير هذه الأولوية يُمكن استخدام الأقواس، حيث إن ما بين الأقواس له الأولوية على البقية.

ملحوظة: عند كتابة الأقواس في سطر الأوامر يجب وضع علامة \ قبلها هكذا: (\ … )\

أمثلة لعمل أمر find

نعرض في هذه الفقرة أمثلة من استخدامات الأمر والبداية مع أمثلة بسيطة.

البحث عن ملف حسب الاسم

  • باعتبار الحروف الصغيرة والكبيرة (في هذه الحالة لن يظهر الملف File.txt إن حددت file.txt في معيار البحث). النقطة تشير إلى أن مجلد البحث هو المجلد الحالي.
find . -name file.txt
  • مع عدم اعتبار الحروف الصغيرة والكبيرة (في هذه الحالة سيظهر الملف File.txt إن حددت file.txt في معيار البحث).
find . -iname file.txt

البحث حسب أذون (صلاحيّات) الملف

  • مثال على البحث عن ملف حسب الإذن، 755 مثلا. في هذا المثال يجري البحث في المجلد الشخصي للمستخدم (يُرمز له بـ ~). لاحظوا علامة الشرطة “-” أمام الإذن في الأمر.
find ~ -perm -775
  • مثال على استخدام أكثر من معيار في البحث، حيثُ نبحث هنا عن ملف عادي (المعيار type f-) يكون لدى الجميع الإذن بالقراءة والكتابة والتنفيذ عليه (المعيار perm -777-).
find . -type f -perm -777
  • إذا أردنا العكس أي جميع الملفات العادية في المجلد الحالي التي تُخالف الأذون عليها الإذن 777 المذكور سابقا.
find . -type f ! -perm -777

سيُنفذ الأمر بالطريقة التالية: يطبَّق المعيار الذي تسبقه أداة النفي أولا فكما قلنا لدى النفي الأولوية في غياب الأقواس، أي أنه سيحدث إقصاء جميع الملفات (بأنواعها ملف عادي أو مجلد أو غيره) التي عليها الإذن 777 بعدها يُطبق المعيار الثاني (type f-) حيثُ f تدل على الملفات العادية (نُذَكّر أنه في لينوكس فإن لفظة “ملف” تشمل المجلدات والروابط وأمور أخرى). في المُحصِّلة نحصل على ملفات عادية ليس على أي منها إذن 777 (لدى جميع المستخدمين الإذن بالقراءة والكتابة والتنفيذ).

البحث حسب التاريخ

  • البحث عن الملفات الموجودة في المجلد Documents التي جرى عليها تعديل في آخر 50 يوما.
find /home/zeine77/Documents -mtime 50
  • البحث عن الملفات الموجودة في المجلد Documents التي تُوصّل إليها (قراءة مستند مثلا دون التعديل عليه) في آخر 50 يوما.
find /home/zeine77/Documents -atime 50
  • البحث عن الملفات الموجودة في المجلد Documents التي جرى عليها تعديل في الفترة بين 50-100 يوم من الآن. أي أن الملفات التي عُدِّل عليها قبل 49 يوما أو قبل 101 يوم لن تظهر.
find /home/zeine77/Documents -mtime +50 –mtime -100

ملحوظة 1: ذكرتُ في تدوينة مقدمة عن النسخ الاحتياطي أنه توجد على غنو/لينوكس ثلاث تواريخ.

في نظام تشغيل ليونكس نميز بين عدة تواريخ بخصوص الملفات:

  • تاريخ التعديل- mtime: تتغير هذه القيمة عند تغيير محتوى الملف.
  • تاريخ الوصول- atime: تتغير هذه القيمة عند فتح الملف، سواء عن طريق مستخدم عادي أو سكريبت أو أداة نسخ احتياطي.
  • تاريخ التغيير- ctime: تتبدل هذه القيمة عند تغيير أي خاصية من خواص الملف (الملكية أو الأذون مثلا).

يمكن البحث عبر الأمر find حسب أي من هذه التواريخ. الوحدة المستخدمة مع هذه التواريخ هي الأيام (لأكون دقيقا هي مضاعفات 24 ساعة، أي أن 1 تعني 1*24ساعة و3 تعني 3*24ساعة وهكذا).

ملحوظة 2: يمكن البحث اعتمادا على الدقائق بدل الأيام وذلك عبر استخدام mmin و amin و cmin.

البحث عبر معايير أخرى

  • البحث ضمن المسار tmp/ عن جميع المجلدات الخاوية (التي لا يوجد بها ملفات).
find /tmp -type d -empty
  • البحث ضمن المسار tmp/ عن جميع الملفات العادية المخبأة (المخفية).
find /tmp -type f -name ".*"
  • البحث عن جميع الملفات ذات الامتداد php في المجلد الشخصي للمستخدم.
find ~ -type f -name ".php"

الاستخدام المتقدم للأمر find

في بداية هذه التدوينة ذكرنا أن أمر find يُستخدم على النحو التالي:

find where-to-look criteria what-to-do

في الفقرات السابقة تحدثنا عن جزئيتي where-to-look حيث قلنا إنها لتحديد المجلد الذي سيجري فيه البحث وجزئية criteria التي قلنا إنها لتحديد معايير البحث. بقيت الجزئية الأخيرة what-to-do التي نقصد بها العملية التي ستُنفَّذ على النتائج والتي تساوي في حالة عدم ذكرها أمر طباعة/عرض (print) النتائج. في هذه الفقرة سأتحدث عن عمليتين أخريين.

  • مع ls-

الهدف من هذه العملية هو عرض نتائج البحث بنفس طريقة السرد التي يُطبقها أمر ls -l أي إظهار تفاصيل كل ملف وليس فقط مساره. نأخذ الأمرين التاليين مثلا:

find . -type f -perm 775
find . -type f -perm 775 -ls

نتيجة الأمر الأول عندي هي:

./gzip-files.sh

بينما نتيجة الأمر الثاني:

1313333    4 -rwxrwxr-x   1 zeine77  zeine77        64 Jan 20 15:05 ./gzip-files.sh

لاحظ أن الأمر الثاني أظهر كل تفاصيل الملف (المالك، والمجموعة وتاريخ آخر تغيير والحجم ..إلخ).

  • مع delete-

ومهمته حذف كل الملفات والمجلدات التي يُعثر عليها وفق معايير البحث. ينبغي الحذر عند استخدام هذه العملية وتذكر أن البحث يجري بشكل تكراري (داخل المجلدات الفرعية والمجلدات المتفرعة عنها) وليس فقط في المجلد المحدد في عملية البحث. يُنصَح باستخدام العملية ls- لعرض النتائج قبل استخدام delete-. هذه الخاصية في غاية الروعة للاستخدام خصوصا في إدارة الأنظمة ولكن تذكر مع القوة ينبغي أن تأتي المسؤولية. لذا استخدمها بحذر.

  • مع exec-

من وجهة نظري هذه هي أقوى الميزات (وبالتالي أشدها خطورة) التي يوفرها أمر find. تأخذ exec- كل ملف من نتائج البحث ثم تطبق عليه الأمر الذي يأتي بعدها. سأعطي هنا مثالا لاستخدامها مع الأمر cp (نسخ ملف).

الأمر التالي يبحث عن جميع الملفات ذات الامتداد old. في المجلد الحالي ثم يُطبق الأمر cp لعمل نسخة من كل ملف ووضعها في المجلد الموجود في المسار /home/zeine77.

find . -name "*.old" -exec cp {} /home/zeine77/ \;

مبدأ العمل هو التالي: يُنفّذ الأمر الموجود بعد exec- حتى الوصول إلى علامة ;\ مع إبدال {} بملف من نتائج البحث في كل مرة. لنفترض أن نتيجة البحث التالي:

find . -name "*.old"

هي

f1.old
f2.old
f3.old

على هذا الأساس فإن

find . -name "*.old" -exec cp {} /home/zeine77/ \;

سيكون كما لو أننا نفذنا الأوامر التالية على التوالي:

cp f1.old /home/zeine77/
cp f2.old /home/zeine77/
cp f3.old /home/zeine77/

أرجو أن تكون الفكرة وصلت :).

نكتفي بهذا القدر من find. احفظ التدوينة في المفضّلة للعودة إليها عند الحاجة وكن حذِرا عند استخدام exec- أو delete- مع الأمر find.

لا تنس مشاركة هذه التدوينة عبر أزرار التشارك الاجتماعي أسفله.

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

مصادر

http://www.grymoire.com/unix/Find.html
http://www.funix.org/fr/unix/grep-find.htm#La%20commande%20find
http://content.hccfl.edu/pollock/unix/findcmd.htm
http://www.tutorialized.com/tutorial/10-examples-of-using-find-command-in-Linux/67264
http://www.tecmint.com/35-practical-examples-of-linux-find-command/

فضلًا.. شارك هذا المقال 🙂

Email this to someoneTweet about this on TwitterShare on FacebookShare on Google+Share on StumbleUpon

zeine77

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

تعليق واحد 1

  1. السلام عليكم اضعت كل البرامج في ابونتو
    17.04
    gnome-software not install
    synaptic apply not work
    pleas help my
    no have any program

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *