النقاط الرئيسية
- 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
يوجد عدد كبير من الخيارات. ننصحك بالاطلاع على صفحات الدليل الخاصة بهم لمعرفة المزيد.