النقاط الرئيسية
- 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
تُظهر هذه القائمة ملفات البرنامج النصي الموجودة في الدليل الحالي.
نحصل على عمود واحد كما هو متوقع. إذا قمنا بنقله عبر xargs ماذا نحصل عليه؟
ls -1 ./*.sh | xargs
يتم كتابة الإخراج في نافذة المحطة الطرفية، كدفق طويل من النص.
هذه هي القدرة التي تسمح لنا xargs إدخال المعلمات في الأوامر الأخرى.
استخدام xargs مع wc
يمكننا أن نستخدم xargs أن يكون لديك بسهولة wc عد الكلمات والحروف والأسطر في ملفات متعددة.
ls *.page | xargs wc
وهذا ما يحدث:
lsيسرد ملفات *.page ويمرر القائمة إلىxargs.xargsيمرر أسماء الملفات إلىwc.wcيعامل أسماء الملفات كما لو كان قد تلقاها كمعلمات سطر أوامر.
يتم عرض الإحصائيات لكل ملف مع الإجمالي العام.
استخدام xargs مع التأكيد
يمكننا استخدام -p (الخيار التفاعلي) xargs يدفعنا إلى التأكيد على أننا سعداء باستمرار ذلك.
إذا مررنا سلسلة من أسماء الملفات إلى touch، خلال xargs, touch سوف إنشاء الملفات بالنسبة لنا.
echo 'one two three' | xargs -p touch
يتم عرض الأمر الذي سيتم تنفيذه xargs ينتظر منا الرد بكتابة “y” أو “Y”، أو “n” أو “N”، ثم الضغط على Enter.
إذا ضغطت على Enter فقط، فسيتم التعامل معه على أنه “n”. سيتم تنفيذ الأمر فقط إذا كتبت “y” أو “Y”.
لقد ضغطنا على “y” ثم ضغطنا على Enter. يمكننا استخدام ls للتأكد من إنشاء الملفات.
ls one two three
استخدام xargs مع أوامر متعددة
يمكننا استخدام أوامر متعددة مع xargs عن طريق استخدام -I خيار (الحجج الأولية).
يحدد هذا الخيار “استبدال السلسلة”. أينما يظهر الرمز الخاص باستبدال السلسلة في سطر الأوامر، يتم عرض القيم التي تم توفيرها لـ xargs تم ادراجها.
دعونا نستخدم tree أمر للنظر إلى الدلائل الفرعية من الدليل الحالي. -d خيار (الدليل) يسبب tree لتجاهل الملفات والإبلاغ عن الدلائل فقط.
tree -d
هناك دليل فرعي واحد يسمى “الصور”.
في ملف يسمى “directories.txt”، لدينا أسماء بعض الدلائل التي نرغب في إنشائها. يمكننا الاطلاع على محتوياتها باستخدام cat.
cat directories.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سوف يقوم الأمر بإنشاء الدليل.
يتم إدراج الدلائل واحدة تلو الأخرى.
يمكننا أن نستخدم tree مرة أخرى للتأكد من إنشاء الدلائل.
tree -d
نسخ الملفات إلى مواقع متعددة
يمكننا أن نستخدم xargs للسماح لنا بنسخ الملفات إلى مواقع متعددة باستخدام أمر واحد.
سنقوم بنقل أسماء الدليلين إلى xargs كمعلمات الإدخال. سنخبرك xargs لتمرير أحد هذه المعلمات فقط في كل مرة إلى الأمر الذي يعمل به.
في هذه الحالة، الأمر هو cp. لذا فإن التأثير هو استدعاء cp مرتين، في كل مرة باستخدام أحد الدليلين كمعلمة لسطر الأوامر. xargs المعلمة التي تسمح بحدوث ذلك هي -n (الحد الأقصى للعدد) الخيار. سنقوم بتعيين هذا ليكون واحدًا.
نحن نستخدم أيضا -v خيار (مطول) مع cp حتى يتمكن من الإبلاغ عما يحدث.
echo ~/Backups/ ~/Documents/page-files/ | xargs -n 1 cp -v ./*.page
تتم نسخ الملفات إلى الدليلين، دليل واحد في كل مرة. 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يتم استبدال “{}” باسم كل ملف.
يتم البحث في كافة الدلائل الفرعية، ويتم حذف الملفات التي تطابق نمط البحث.
إزالة الدلائل المتداخلة
لنفترض أننا نريد إزالة مجموعة من الدلائل الفرعية المتداخلة. tree سوف يسمح لنا برؤيتهم.
tree -d
find . -name "level_one" -type d printo | xargs -o rm -v -rf "{}"
سيستخدم هذا الأمر find للبحث بشكل متكرر داخل الدليل الحالي. هدف البحث هو دليل يسمى “level_one”. يتم تمرير أسماء الدليل من خلال xargs ل rm.
التغييرات المهمة الوحيدة بين هذا الأمر والأمر السابق هي أن مصطلح البحث هو اسم الدليل الأعلى، و -type d يقول find للبحث عن الدلائل، وليس الملفات.
يتم طباعة اسم كل دليل عند إزالته. يمكننا التحقق من ذلك باستخدام tree :
tree -d
سيتم حذف كافة الدلائل الفرعية المتداخلة.
حذف كافة الملفات، باستثناء نوع ملف واحد
يمكننا أن نستخدم find, xargs و rm لحذف كافة الملفات باستثناء نوع واحد نريد الاحتفاظ به. قد يبدو الأمر غير بديهي بعض الشيء، لكننا نقدم اسم نوع الملف الذي نريد الاحتفاظ به، وليس اسم الملفات التي نريد حذفها.
ال -not الخيار يقول find لإرجاع أسماء الملفات التي لا تتطابق مع نمط البحث. نحن نستخدم -I خيار (الحجج الأولية) مع xargs مرة أخرى. هذه المرة رمز استبدال السلسلة الذي نقوم بتعريفه هو “{}”. سيتصرف هذا بنفس الطريقة تمامًا مثل رمز استبدال السلسلة الذي قمنا بإنشائه سابقًا، والذي كان “%”.
find . -type f -not - name "*.sh" -print0 | xargs -0 -I {} rm -v {}
يمكننا التحقق مع lsالملفات الوحيدة المتبقية في الدليل هي الملفات التي تطابق نمط البحث “*.sh”.
ls -l
إنشاء ملف أرشيف باستخدام Xargs
يمكننا أن نستخدم find للبحث عن الملفات وتمريرها xargs ل tarلإنشاء ملف أرشيف.
سنبحث في الدليل الحالي. نمط البحث هو “*.page”، لذا سنبحث عن الملفات ذات الامتداد “.page”.
find ./ - name "*.page" -type f -print0 | xargs -0 -tar -cvzf page_files.tar.gz
يتم إدراج الملفات كما هو متوقع، أثناء إنشاء ملف الأرشيف.
في بعض الأحيان قد تحتاج إلى القليل من السقالة عندما تقوم بتكديس الأشياء معًا. xargs يقوم بسد الفجوة بين الأوامر التي يمكنها ضخ المعلومات والأوامر التي لم يتم إنشاؤها لاستقبالها.
كلاهما xargs و find يوجد عدد كبير من الخيارات. ننصحك بالاطلاع على صفحات الدليل الخاصة بهم لمعرفة المزيد.