আপনার নির্দিষ্ট উদাহরণের জন্য, আপনি এটি করতে পারেন:
find . -type f -name "*.txt" -exec grep FirstKeyWord {} \; | grep "SecondKeyWord"
BTW, এটি একটি দ্বিতীয় grep ব্যবহার ছাড়াও করা যাবে। পরিবর্তে, ব্যবহার করুন egrep
দুই বিকল্প সঙ্গে FirstKeyWord
অনুসরণ করে SecondKeyWord
অথবা SecondKeyWord
অনুসরণ করে FirstKeyWord
:
find . -type f -name "*.txt" -exec egrep "FirstKeyWord.*SecondKeyWord|SecondKeyWord.*FirstKeyWord" {} \;
আপনি থেকে ফলে pathnames সম্পর্কে কিছু গ্যারান্টি করতে পারেন find
(কোন নেতৃস্থানীয় বা অভ্যন্তরীণ স্পেস এবং পাথনামগুলিতে কোন নতুন তালিকা নেই), আপনি এটি এভাবেও করতে পারেন:
find . -type f -name "*.txt" -print | while read filename; do grep "FirstKeyWord" "${filename}" | grep "SecondKeyWord"; done
আরো সাধারণ উত্তর "আপনি না" সরাসরি থেকে find
। পাইপিং আদেশ বা ব্যবহার &&
অথবা ||
শেলের একটি ফাংশন, কার্য সম্পাদন প্রক্রিয়াগুলির একটি ফাংশন নয়।
আমি আগে এই প্যাটার্ন ব্যবহার করেছি, কিন্তু এটি ভঙ্গুর এবং আরো জটিল:
find . -type f -name "*.txt" -print \
| sed -e 's;[\\$"`!];\\&;g' \
-e 's;^.*$;grep "FirstKeyWord" "&" | grep "SecondKeyWord";' \
| sh
প্রতিটি ফাইলের নাম মুদ্রণ করুন, ব্যবহার করুন sed
ফ্লাইতে এটি একটি শেল স্ক্রিপ্টে রূপান্তরিত করতে (ফাইল নামতে অক্ষরগুলি এড়িয়ে যাওয়ার সতর্কতা অবলম্বন করে যা শেল ডাবল-কোটগুলিতে আবদ্ধ হলে সমস্যার কারণ হতে পারে), তারপরে শেলের মাধ্যমে ফলাফলটি চালান।
অন্য সমাধান হল একটি শেল স্ক্রিপ্ট তৈরি করা যা আপনার প্রক্রিয়াকরণ করে এবং যে শেল স্ক্রিপ্টটিকে খুঁজে বের করে:
$ cat grepit.sh
#!/bin/sh
grep "FirstKeyWord" "$1" | grep "SecondKeyWord"
$ find . -type f -name "*.txt" -exec sh grepit.sh {} \;