هل يحتوي "grep" على الحد الأقصى من الملفات التي يمكنه التعامل معها؟

StackOverflow https://stackoverflow.com/questions/19848938

سؤال

لقد ركضت للتو:

grep ""  *.txt > out.txt 

على 1500 ملفلم يتضمن الإخراج سوى بضع مئات من الملفات.لماذا؟

عند الاستخدام:

cat  *.txt > out.txt 

يعمل هذا، ولكن أريد اسم الملف كاسم الصف.

شكرًا لك!

هل كانت مفيدة؟

المحلول

هل أنت متأكد من أن جميع الملفات تظهر بالفعل؟ 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

نصائح أخرى

أقترح استخدام:

ls -l *.txt | cut -b 51-

ايضا *.txt يتم توسيعه بواسطة المحطة الخاصة بك قبل نقله إلى cat أو grep. لذا نعم ، من الناحية النظرية ، هناك حد لعدد وسيطات الملفات التي يمكنك نقلها إلى أمر.

  • ls -l *.txt يمنحك قائمة بالملفات في الدليل.
  • | هو أنبوب ويعني أنه يمكنك تمرير إخراج الأمر السابق إلى آخر.
  • cut -b 51- يعني أنك قطعت أول 50 بايت وهذا يمنحك أسماء الملفات.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top