هل أنت متأكد من أن جميع الملفات تظهر بالفعل؟ cat *.txt > out
؟ما لم تكن على حافة الحد الأقصى لعدد الأحرف لكل أمر، فلا ينبغي أن يحدث ذلك فرقًا.جرب هذا:
ls -1 | egrep '\.txt$' | xargs egrep "" /dev/null > out
ls -1
يسرد جميع الملفات الموجودة في الدليل، واسم ملف واحد في كل سطر، والأول egrep
يقوم بتصفية تلك التي تنتهي بـ ".txt" فقط.بهذه الطريقة، لا داعي للقلق بشأن نفاد طول سطر الأوامر في قائمة الملفات. xargs
يقرأ stdin
, ، حتى يحصل على أكبر عدد ممكن من الأسطر في سطر أوامر واحد بعد الوسائط الأخرى xargs
.ثم يقوم بعد ذلك باستدعاء الأمر الذي تقدمه مع الخيارات التي قدمتها مع مجموعة معلمات الإدخال تلك. xargs
ثم يكرر هذه العملية حتى يستخدم جميع الوسائط التي تقدمها.كل استدعاء للنهائي egrep
يكتب لنفس stdout
, ، لذلك يذهب كل الإخراج إلى نفس الملف.
ال /dev/null
هناك في حالة xargs
يعثر على سطر واحد فقط من الإدخال (على سبيل المثال، لأنه لديك ملف واحد فقط أو عند تجميع الملفات، تحتوي الحزمة الأخيرة على ملف واحد فقط).إذا اتصلت egrep
مع ملف واحد، فإنه لا يطبع اسم الملف.نظرًا لأنك قلت على وجه التحديد أنك تريد أسماء الملفات، أخبرنا بذلك egrep
للبحث /dev/null
يضمن أنه سيكون هناك دائمًا ملفان على الأقل.منذ /dev/null
من المؤكد أن تكون فارغة، فلن تجد أي شيء فيها أبدًا، ولن تظهر في مخرجاتك.
xargs
يعمل بشكل رائع مع find
.إذا أردت البحث عن "foo" في كافة ملفات ".txt" الموجودة في الدليل الحالي وأدلته الفرعية:
find . -name "*.txt" -print | xargs egrep foo /dev/null
سوف تفعل الخدعة.إذا كانت لديك أسماء ملفات تحتوي على مسافات، فلن يتم اقتباسها و egrep
سوف تشعر بالارتباك، لذا استخدم -print0
الخيار على find
و ال -0
الخيار على xargs:
find . -name "*.txt" -print0 | xargs -0 egrep foo /dev/null