كيفية استخدام الأمر find في Linux

النقاط الرئيسية

  • يعد أمر البحث في Linux أداة فعالة للبحث عن الملفات والدلائل باستخدام معايير مختلفة، مثل أنواع الملفات أو الملكية.
  • من خلال استخدام الأمر find مع xargs، يمكنك تمرير نتائج البحث إلى أوامر أخرى لمزيد من المعالجة.
  • يتيح لك الخيار -exec في أمر البحث استدعاء برامج خارجية وإجراء معالجة إضافية على أسماء الملفات التي تم إرجاعها بواسطة البحث.



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


أمر البحث في لينكس

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

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


إن مبدأ توصيل مخرجات أمر ما إلى أمر آخر هو سمة أساسية لأنظمة التشغيل المشتقة من يونكس. إن مبدأ التصميم المتمثل في جعل البرنامج يقوم بشيء ما ويؤديه بشكل جيد، وتوقع أن يكون مخرجه مدخلاً لبرنامج آخر – حتى لو كان برنامجًا لم يُكتب بعد – يُوصف غالبًا بأنه “فلسفة يونكس”. ومع ذلك، فإن بعض الأدوات الأساسية، مثل mkdirلا تقبل الإدخال المباشر.

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


سنقدم لك بعض الأمثلة لأمر find على Linux للمساعدة في توضيح بعض استخداماته.

استخدام find مع xargs

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

find ./ -name "*.page" -type f -print0 | xargs -0 tar -cvzf page_files.tar.gz

توجيه putput من find عبر xargs إلى tar

يتكون الأمر من عناصر مختلفة.


  • البحث عن ./ -name “*.page” -type f -print0:سيبدأ إجراء البحث في الدليل الحالي، حيث يبحث بالاسم عن الملفات التي تتطابق مع سلسلة البحث “*.page”. لن يتم سرد الدلائل لأننا نخبره على وجه التحديد بالبحث عن الملفات فقط، مع -type f. ال print0 الحجة تقول find عدم التعامل مع المسافات البيضاء باعتبارها نهاية اسم الملف. وهذا يعني أن أسماء الملفات التي تحتوي على مسافات سيتم معالجتها بشكل صحيح.
  • xargs -o: ال -0 الحجج xargs عدم التعامل مع المسافة البيضاء على أنها نهاية اسم الملف.
  • tar -cvzf page_files.tar.gz:هذا هو الأمر xargs سيتم تغذية قائمة الملفات من find ستقوم أداة tar بإنشاء ملف أرشيف يسمى “page_files.tar.gz”.

يمكننا أن نستخدم ls لرؤية ملف الأرشيف الذي تم إنشاؤه لنا.

ls *.gz

ملف الأرشيف الذي تم إنشاؤه عن طريق توجيه إخراج find عبر xargs إلى tar


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

يمكنك اختيار تشغيل الأمر النهائي على جميع أسماء الملفات مرة واحدة أو استدعاؤه مرة واحدة لكل اسم ملف. يمكننا أن نرى الفرق بسهولة تامة عن طريق توجيه الإخراج من xargs إلى أداة حساب الأسطر والأحرف wc.

يقوم هذا الأمر بتوجيه جميع أسماء الملفات إلى wc في الحال. فعليا، xargs إنشاء سطر أوامر طويل لـ wc مع كل أسماء الملفات الموجودة فيه.

find . -name "*.page" -type f -print0 | xargs -0 wc

نقل أسماء ملفات متعددة إلى wc في وقت واحد


يتم طباعة الأسطر والكلمات والأحرف لكل ملف، بالإضافة إلى الإجمالي لجميع الملفات.

إحصائيات عدد الكلمات للعديد من الملفات، مع إجمالي عدد الكلمات لجميع الملفات

إذا استخدمنا xarg‘س -I خيار (استبدال السلسلة) وتحديد رمز سلسلة الاستبدال — في هذه الحالة ” {}“- يتم استبدال الرمز في الأمر النهائي بكل اسم ملف على التوالي. وهذا يعني wc يتم استدعاؤها بشكل متكرر، مرة واحدة لكل ملف.

find . -name "*.page" -type f -print0 | xargs -0 -I "{}" wc "{}"

استخدام سلسلة استبدال لإرسال أسماء الملفات إلى wc واحدًا تلو الآخر


لم يتم ترتيب الإخراج بشكل جيد. كل استدعاء لـ wc يعمل على ملف واحد لذا wc لا يوجد شيء لمحاذاة الإخراج معه. كل سطر من الإخراج هو سطر مستقل من النص.

الناتج من استدعاءات متعددة لـ wc

لأن wc لا يمكن توفير إجمالي إلا عند تشغيله على ملفات متعددة في وقت واحد، ولا نحصل على إحصائيات الملخص.

خيار find -exec

ال find يحتوي الأمر على طريقة مدمجة لاستدعاء البرامج الخارجية لإجراء معالجة إضافية على أسماء الملفات التي يعيدها. -exec يحتوي خيار (تنفيذ) على بناء جملة مشابه لـ ولكن مختلف عن xargs يأمر.

find . -name "*.page" -type f -exec wc -c "{}" \;


استخدام -exec لإرسال أسماء ملفات فردية إلى wc

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

  • يجد .:ابدأ البحث في الدليل الحالي. find يكون الأمر متكررًا بشكل افتراضي، لذا سيتم البحث في الدلائل الفرعية أيضًا.
  • -الاسم “*.الصفحة”:نحن نبحث عن الملفات التي تحمل أسماء تتطابق مع سلسلة البحث “*.page”.
  • -النوع ف:نحن نبحث فقط عن الملفات، وليس الدلائل.
  • -مرحاض تنفيذي:سوف نقوم بتنفيذ wc الأمر على أسماء الملفات التي تتطابق مع سلسلة البحث.
  • :يجب وضع أية خيارات تريد تمريرها إلى الأمر مباشرة بعد الأمر.
  • “{}”:يمثل العنصر النائب “{}” كل اسم ملف ويجب أن يكون العنصر الأخير في قائمة المعلمات.
  • \;: يتم استخدام الفاصلة المنقوطة “;” للإشارة إلى نهاية قائمة المعلمات. يجب أن يتم تجاوزها باستخدام الشرطة المائلة العكسية “\” حتى لا يفسرها shell.


عندما نقوم بتشغيل هذا الأمر نرى الناتج wc. ال -c (عدد البايتات) يقتصر إخراجها على عدد البايتات الموجودة في كل ملف.

النتيجة من استخدام -exec لإرسال العديد من أسماء الملفات الفردية إلى wc

كما ترى لا يوجد إجمالي. wc يتم تنفيذ الأمر مرة واحدة لكل اسم ملف. عن طريق استبدال علامة الجمع “+“للفاصلة المنقوطة النهائية”;“يمكننا أن نتغير” -execسلوك ‘s للعمل على جميع الملفات في وقت واحد.

find . -name "*.page" -type f -exec wc -c "{}" \+

استخدام -exec لإرسال جميع أسماء الملفات إلى wc مرة واحدة


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

الناتج من استخدام -exec لإرسال جميع أسماء الملفات إلى wc مرة واحدة

exec تعني في الحقيقة exec

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

يحتوي هذا الكمبيوتر على وظيفة غلاف محددة تسمى words-onlyيقوم هذا بحساب الكلمات الموجودة في الملف فقط.


function words-only () { wc -w $1}

ربما تكون وظيفة غريبة، حيث إن كتابة “words-only” أطول بكثير من كتابة “wc -w”، ولكن على الأقل هذا يعني أنك لست بحاجة إلى تذكر خيارات سطر الأوامر لـ wcيمكننا اختبار ما يفعله على النحو التالي:

words-only user_commands.pages

استخدام دالة shell لحساب الكلمات في ملف واحد

يعمل هذا بشكل جيد مع استدعاء سطر الأوامر العادي. إذا حاولنا استدعاء هذه الوظيفة باستخدام find‘س -exec الخيار سوف يفشل.

find . -name "*.page" -type f -exec words-only "{}" \;

محاولة استخدام دالة shell مع -exec


ال find لا يمكن للأمر العثور على وظيفة shell، و -exec فشل الإجراء.

-exec فشل في العثور على وظيفة shell، بسبب عدم تشغيل find في shell

للتغلب على هذا يمكننا أن نمتلك find قم بتشغيل غلاف Bash، ثم مرر بقية سطر الأوامر إليه كحجج للغلاف. نحتاج إلى وضع سطر الأوامر بين علامتي اقتباس مزدوجتين. وهذا يعني أننا نحتاج إلى تجنب علامات الاقتباس المزدوجة الموجودة حول “{}“استبدال السلسلة.

قبل أن نتمكن من تشغيل find الأمر، نحتاج إلى تصدير وظيفة shell الخاصة بنا باستخدام -f (كوظيفة) الخيار:

export -f words-only

find . -name "*.page" -type f -exec bash -c "words-only \"{}\"" \;


استخدام find لتشغيل shell لتشغيل وظيفة shell في

يتم تشغيل هذا كما هو متوقع.

وظيفة shell التي يتم استدعاؤها في shell جديد

استخدام اسم الملف أكثر من مرة باستخدام البحث

إذا كنت تريد ربط عدة أوامر معًا، فيمكنك القيام بذلك، ويمكنك استخدام “{}“استبدال السلسلة في كل أمر.

find . -name "*.page" -type f -exec bash -c "basename "{}" && words-only "{}"" \;


إذا كنا cd قم برفع مستوى خارج دليل “الصفحات” وقم بتشغيل هذا الأمر، find سيظل يكتشف ملفات PAGE لأنه يبحث بشكل متكرر. يتم تمرير اسم الملف والمسار إلى words-only تعمل كما كانت من قبل. لأسباب بحتة لإثبات الاستخدام -exec باستخدام أمرين، نقوم أيضًا باستدعاء basename أمر لرؤية اسم الملف بدون مساره.

كلاهما basename الأمر و words-only يتم تمرير أسماء الملفات إلى دالة shell باستخدام “{}“استبدال السلسلة.

استدعاء أمر basename ووظيفة shell woirds-only من نفس استدعاء -exec

خيول للدورات

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


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

أضف تعليق