كيفية استخدام الأمر xargs على Linux

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

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



هل تحتاج إلى ربط بعض أوامر Linux معًا، ولكن أحدها لا يقبل الإدخال المباشر؟ xargs هذا هو الأمر لك.


لماذا استخدام الأمر xargs؟

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

جميع أدوات Linux القياسية لديها ثلاثة تدفقات بيانات المرتبطة بها. وهي عبارة عن تيار الإدخال القياسي (stdin)، ودفق الإخراج القياسي (stdout)، ودفق الخطأ القياسي (stderr). باستخدام xargs يمكننا عمل أوامر مثل echo, rm، و mkdir قبول المدخلات القياسية كحجج.

تعمل هذه التدفقات باستخدام النص. نرسل الإدخال (stdin) إلى أمر باستخدام النص، ويتم كتابة الاستجابة (stdout) في نافذة المحطة الطرفية كنص. كما تتم كتابة رسائل الخطأ في نافذة المحطة الطرفية كنص (stderr).


من بين الميزات الرائعة لأنظمة التشغيل Linux وUnix-like هي القدرة على توجيه إخراج stdout من أمر واحد إلى مدخل stdin لأمر ثانٍ. لا يهتم الأمر الأول بأن إخراجه لن يذهب إلى نافذة طرفية، ولا يهتم الأمر الثاني بأن مدخله لن يأتي من لوحة المفاتيح.

على الرغم من أن جميع أوامر Linux تحتوي على ثلاثة تدفقات قياسية، إلا أنها لا تقبل جميعها stdout لأمر آخر كمدخل إلى stdin الخاص بها. وهذا يعني أنه لا يمكنك توجيه الإدخال إليها.

وهنا يأتي دور xargs. لقد قمنا بتغطية بعض أمثلة أوامر xargs المفيدة — فلا تتردد في تخطيها قليلاً. لا تعتمد الأمثلة بالضرورة على بعضها البعض.

الأمر xargs

xargs سيقبل الإدخال المباشر. ويمكنه أيضًا قبول الإدخال من ملف. xargs يستخدم هذا الإدخال كمعلمات للأوامر التي أخبرناه بالعمل بها. إذا لم نخبره بذلك xargs للعمل بأمر معين، سيتم استخدام الأمر افتراضيًا echo.


يمكننا استخدام ذلك لإظهار كيف xargs سيتم دائمًا إنشاء سطر واحد من الإخراج، حتى من الإدخال متعدد الأسطر.

إذا استخدمنا -1 (قائمة ملف واحد لكل سطر) الخيار مع ls، نحصل على عمود واحد من أسماء الملفات.

ls -1 ./*.sh

v في نافذة المحطة الطرفية

تُظهر هذه القائمة ملفات البرنامج النصي الموجودة في الدليل الحالي.

إخراج ls في نافذة المحطة الطرفية

نحصل على عمود واحد كما هو متوقع. إذا قمنا بنقله عبر xargs ماذا نحصل عليه؟

ls -1 ./*.sh | xargs


ls -1 ./*.sh | xargs في نافذة المحطة الطرفية

يتم كتابة الإخراج في نافذة المحطة الطرفية، كدفق طويل من النص.

ls يتم توجيهه عبر xargs في نافذة المحطة الطرفية

هذه هي القدرة التي تسمح لنا xargs إدخال المعلمات في الأوامر الأخرى.

استخدام xargs مع wc

يمكننا أن نستخدم xargs أن يكون لديك بسهولة wc عد الكلمات والحروف والأسطر في ملفات متعددة.

ls *.page | xargs wc

ls *.page | xargs wc في نافذة المحطة الطرفية


وهذا ما يحدث:

  • ls يسرد ملفات *.page ويمرر القائمة إلى xargs.
  • xargs يمرر أسماء الملفات إلى wc.
  • wc يعامل أسماء الملفات كما لو كان قد تلقاها كمعلمات سطر أوامر.

مخرجات wc في نافذة المحطة الطرفية

يتم عرض الإحصائيات لكل ملف مع الإجمالي العام.

استخدام xargs مع التأكيد

يمكننا استخدام -p (الخيار التفاعلي) xargs يدفعنا إلى التأكيد على أننا سعداء باستمرار ذلك.

إذا مررنا سلسلة من أسماء الملفات إلى touch، خلال xargs, touch سوف إنشاء الملفات بالنسبة لنا.

echo 'one two three' | xargs -p touch

صدى 'واحد اثنان ثلاثة' | xargs -p اللمس في نافذة المحطة الطرفية


يتم عرض الأمر الذي سيتم تنفيذه xargs ينتظر منا الرد بكتابة “y” أو “Y”، أو “n” أو “N”، ثم الضغط على Enter.

إذا ضغطت على Enter فقط، فسيتم التعامل معه على أنه “n”. سيتم تنفيذ الأمر فقط إذا كتبت “y” أو “Y”.

xargs يطالب بالتأكيد في نافذة المحطة الطرفية

لقد ضغطنا على “y” ثم ضغطنا على Enter. يمكننا استخدام ls للتأكد من إنشاء الملفات.

ls one two three

إخراج ls في نافذة المحطة الطرفية


استخدام xargs مع أوامر متعددة

يمكننا استخدام أوامر متعددة مع xargs عن طريق استخدام -I خيار (الحجج الأولية).

يحدد هذا الخيار “استبدال السلسلة”. أينما يظهر الرمز الخاص باستبدال السلسلة في سطر الأوامر، يتم عرض القيم التي تم توفيرها لـ xargs تم ادراجها.

دعونا نستخدم tree أمر للنظر إلى الدلائل الفرعية من الدليل الحالي. -d خيار (الدليل) يسبب tree لتجاهل الملفات والإبلاغ عن الدلائل فقط.

tree -d

tree -d في نافذة المحطة الطرفية

هناك دليل فرعي واحد يسمى “الصور”.

في ملف يسمى “directories.txt”، لدينا أسماء بعض الدلائل التي نرغب في إنشائها. يمكننا الاطلاع على محتوياتها باستخدام cat.


cat directories.txt

cat directoryies.txt في نافذة المحطة الطرفية

سنستخدم هذا كبيانات إدخال لـ xargsالأمر الذي سنقوم به هو هذا:

cat directories.txt | xargs -I % sh -c 'echo %; mkdir %'

يتم تقسيم هذا على النحو التالي:

  • cat directories.txt |: يؤدي هذا إلى دفع محتويات ملف directrories.txt (كل أسماء الدليل الجديدة) إلى xargs.
  • xargs -I %: هذا يحدد “استبدال السلسلة” بالرمز “%”.
  • sh -c: يبدأ هذا الأمر غلافًا فرعيًا جديدًا. -c (الأمر) يخبر shell بقراءة الأوامر من سطر الأوامر.
  • ‘echo %; mkdir %’: سيتم استبدال كل رمز “%” بأسماء الدليل التي تم تمريرها بواسطة xargs. ال echo سيقوم الأمر بطباعة اسم الدليل؛ mkdir سوف يقوم الأمر بإنشاء الدليل.


cat directories.txt | xargs -I % sh -c 'echo %; mkdir %' في نافذة المحطة الطرفية

يتم إدراج الدلائل واحدة تلو الأخرى.

إخراج xargs في نافذة المحطة الطرفية

يمكننا أن نستخدم tree مرة أخرى للتأكد من إنشاء الدلائل.

tree -d

الإخراج من الشجرة في نافذة المحطة الطرفية

نسخ الملفات إلى مواقع متعددة

يمكننا أن نستخدم xargs للسماح لنا بنسخ الملفات إلى مواقع متعددة باستخدام أمر واحد.


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

في هذه الحالة، الأمر هو cp. لذا فإن التأثير هو استدعاء cp مرتين، في كل مرة باستخدام أحد الدليلين كمعلمة لسطر الأوامر. xargs المعلمة التي تسمح بحدوث ذلك هي -n (الحد الأقصى للعدد) الخيار. سنقوم بتعيين هذا ليكون واحدًا.

نحن نستخدم أيضا -v خيار (مطول) مع cp حتى يتمكن من الإبلاغ عما يحدث.

echo ~/Backups/ ~/Documents/page-files/ | xargs -n 1 cp -v ./*.page

echo ~/Backups/ ~/Documents/page-files/ | xargs -n 1 cp -v ./*.page في نافذة المحطة الطرفية


تتم نسخ الملفات إلى الدليلين، دليل واحد في كل مرة. cp يقوم بالإبلاغ عن كل عملية نسخ للملف حتى نتمكن من رؤية حدوثها.

إخراج xargs و cp في نافذة المحطة الطرفية

حذف الملفات الموجودة في الدلائل المتداخلة

إذا كانت أسماء الملفات تحتوي على مسافات وأحرف غريبة فيها—مثل أحرف السطر الجديد— xargs لن نتمكن من تفسيرها بشكل صحيح. يمكننا التغلب على هذه المشكلة باستخدام الخيار -0 (الفاصل الصفري). هذا يخبرنا xargs استخدام حرف null كفاصل نهائي لأسماء الملفات.

نحن سوف نستخدم find في هذا المثال. find لديه خيار خاص به التعامل مع المسافات البيضاء والأحرف الغريبة في أسماء الملفات. -print0 (الاسم الكامل، حرف فارغ) الخيار.

find . -name "*.png" -type f -print0 | xargs -0 rm -v -rf "{}"


يتم تقسيم هذا على النحو التالي:

  • البحث عن .-name “*.png”: find سيتم البحث من الدليل الحالي “.” عن الكائنات التي تحمل أسماء تتطابق مع “*.png” والتي هي ملفات (type -f).
  • -print0: سيتم إنهاء الأسماء بحرف فارغ، وسيتم توفير المسافات والأحرف الغريبة.
  • xargs -0: سيقوم xargs أيضًا باعتبار أسماء الملفات منتهية بعلامة فارغة، ولن تتسبب المسافات والأحرف الغريبة في حدوث مشكلات.
  • rm -v -rf “{}”: سيصبح الأمر rm مطولًا وسيبلغ عما يحدث (-v). سيكون الأمر متكررًا (-r) وسيبحث خلال الدلائل الفرعية المتداخلة، وسيزيل الملفات دون مطالبة (-fيتم استبدال “{}” باسم كل ملف.

البحث عن .-name "*.png" -النوع f -print0 | xargs -0 rm -v -rf "{}" في نافذة المحطة الطرفية


يتم البحث في كافة الدلائل الفرعية، ويتم حذف الملفات التي تطابق نمط البحث.

إخراج rm في نافذة المحطة الطرفية

إزالة الدلائل المتداخلة

لنفترض أننا نريد إزالة مجموعة من الدلائل الفرعية المتداخلة. tree سوف يسمح لنا برؤيتهم.

tree -d

tree -d في نافذة المحطة الطرفية

find . -name "level_one" -type d printo | xargs -o rm -v -rf "{}"

سيستخدم هذا الأمر find للبحث بشكل متكرر داخل الدليل الحالي. هدف البحث هو دليل يسمى “level_one”. يتم تمرير أسماء الدليل من خلال xargs ل rm.


البحث عن .-name "المستوى الأول" -نوع د طباعة | xargs -o rm -v -rf "{}" في نافذة المحطة الطرفية

التغييرات المهمة الوحيدة بين هذا الأمر والأمر السابق هي أن مصطلح البحث هو اسم الدليل الأعلى، و -type d يقول find للبحث عن الدلائل، وليس الملفات.

الإخراج من find وxargs وrm في نافذة المحطة الطرفية

يتم طباعة اسم كل دليل عند إزالته. يمكننا التحقق من ذلك باستخدام tree :

tree -d

tree -d في نافذة المحطة الطرفية


سيتم حذف كافة الدلائل الفرعية المتداخلة.

حذف كافة الملفات، باستثناء نوع ملف واحد

يمكننا أن نستخدم find, xargs و rm لحذف كافة الملفات باستثناء نوع واحد نريد الاحتفاظ به. قد يبدو الأمر غير بديهي بعض الشيء، لكننا نقدم اسم نوع الملف الذي نريد الاحتفاظ به، وليس اسم الملفات التي نريد حذفها.

ال -not الخيار يقول find لإرجاع أسماء الملفات التي لا تتطابق مع نمط البحث. نحن نستخدم -I خيار (الحجج الأولية) مع xargs مرة أخرى. هذه المرة رمز استبدال السلسلة الذي نقوم بتعريفه هو “{}”. سيتصرف هذا بنفس الطريقة تمامًا مثل رمز استبدال السلسلة الذي قمنا بإنشائه سابقًا، والذي كان “%”.

find . -type f -not - name "*.sh" -print0 | xargs -0 -I {} rm -v {}

البحث عن . -type f -not - name "*.ش" -print0 | xargs -0 -I {} rm -v {} في نافذة المحطة الطرفية


يمكننا التحقق مع lsالملفات الوحيدة المتبقية في الدليل هي الملفات التي تطابق نمط البحث “*.sh”.

ls -l

الإخراج من ls في نافذة المحطة الطرفية

إنشاء ملف أرشيف باستخدام Xargs

يمكننا أن نستخدم find للبحث عن الملفات وتمريرها xargs ل tarلإنشاء ملف أرشيف.

سنبحث في الدليل الحالي. نمط البحث هو “*.page”، لذا سنبحث عن الملفات ذات الامتداد “.page”.

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

البحث عن ./ - الاسم "*.صفحة" -type f -print0 | xargs -0 -tar -cvzf page_files.tar.gz في نافذة المحطة الطرفية


يتم إدراج الملفات كما هو متوقع، أثناء إنشاء ملف الأرشيف.

إخراج tar في نافذة المحطة الطرفية

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

كلاهما xargs و find يوجد عدد كبير من الخيارات. ننصحك بالاطلاع على صفحات الدليل الخاصة بهم لمعرفة المزيد.


أضف تعليق