bash - تجاهل النتيجة الفارغة ل xargs




centos (4)

خذ بعين الاعتبار هذا الأمر:

ls /mydir/*.txt | xargs chown root

والهدف هو تغيير أصحاب جميع الملفات النصية في mydir إلى الجذر

المشكلة هي أنه إذا لم تكن هناك ملفات .txt في mydir فإن xargs تقوم بعرض خطأ يشير إلى عدم وجود مسار محدد. هذا مثال غير ضار لأنه يتم طرح خطأ ، ولكن في بعض الحالات ، كما هو الحال في البرنامج النصي الذي أحتاج إلى استخدامه هنا ، يفترض أن يكون المسار الفارغ هو الدليل الحالي. حتى إذا قمت بتشغيل هذا الأمر من /home/tom/ إذا لم يكن هناك أي نتيجة لـ ls /mydir/*.txt وجميع الملفات تحت /home/tom/ قد تغير أصحابها إلى الجذر.

فكيف لي أن أتجاهل xargs نتيجة فارغة؟


بالنسبة لـ GNU xargs ، يمكنك استخدام الخيار -r أو --no-run-if-empty :

--no-run-if-empty
-r
إذا لم يتضمن الإدخال القياسي أيًا من غير اللبادات ، فلا تقم بتشغيل الأمر. عادة ، يتم تشغيل الأمر مرة واحدة حتى إذا لم يكن هناك إدخال. هذا الخيار هو ملحق جنو.


على OSX: Bash reimplementation من xargs التعامل مع حجة -r ، ضع ذلك على سبيل المثال في $HOME/bin وأضفه إلى PATH :

#!/bin/bash
stdin=$(cat <&0)
if [[ $1 == "-r" ]] || [[ $1 == "--no-run-if-empty" ]]
then
    # shift the arguments to get rid of the "-r" that is not valid on OSX
    shift
    # wc -l return some whitespaces, let's get rid of them with tr
    linecount=$(echo $stdin | grep -v "^$" | wc -l | tr -d '[:space:]') 
    if [ "x$linecount" = "x0" ]
    then
      exit 0
    fi
fi

# grep returns an error code for no matching lines, so only activate error checks from here
set -e
set -o pipefail
echo $stdin | /usr/bin/xargs [email protected]

يقول man xargs --no-run-if-empty .


يمكن لمستخدمي xargs غير GNU الاستفادة من -L <#lines> و -n <#args> و -i و -I <string> :

ls /empty_dir/ | xargs -n10 chown root # chown executed every 10 args or fewer
ls /empty_dir/ | xargs -L10 chown root # chown executed every 10 lines or fewer
ls /empty_dir/ | xargs -i cp {} {}.bak # every {} is replaced with the args from one input line
ls /empty_dir/ | xargs -I ARG cp ARG ARG.bak # like -i, with a user-specified placeholder

ضع في اعتبارك أن xargs تقسم الخط في مسافة بيضاء ولكن الاقتباس والهروب متاحة ؛ RTFM لمزيد من التفاصيل.





xargs