ডিরেক্টরিতে সমস্ত ফাইলে গ্রেপ অপারেশন কীভাবে সম্পাদন করা হয়


218

Xenserver এর সাথে কাজ করা, এবং আমি প্রতিটি ডিরেক্টরিতে থাকা একটি ফাইলের একটি কমান্ড সম্পাদন করতে চাই, কমান্ডের আউটপুট থেকে কিছু স্টাফ চেপে ধরে এবং এটি একটি ফাইলে সংযোজন করি।

আমি যে কমান্ডটি ব্যবহার করতে চাইছি এবং কীভাবে স্ট্রিংগুলি প্রয়োজন অনুযায়ী গ্রেপ আউট করা যায় সে সম্পর্কে আমি স্পষ্ট।

তবে আমি যা পরিষ্কার করছি না তা হ'ল আমার কাছে এটি কীভাবে প্রতিটি ফাইলের এই কমান্ডটি সঞ্চালন করতে হবে, পরবর্তী ফাইলটিতে কোনও ফাইল না পাওয়া পর্যন্ত।

উত্তর:


228

grep $PATTERN *যথেষ্ট হবে। ডিফল্টরূপে, গ্রেপ সমস্ত উপ-ডিরেক্টরিকে এড়িয়ে যাবে। যাইহোক, আপনি যদি তাদের মাধ্যমে গ্রেপ করতে চান grep -r $PATTERN *তবে কেস।


37
"গ্রেপ -আর AT প্যাটার্ন পর্যাপ্ত. রিকার্সিভ গ্রেপের জন্য আপনাকে সমস্ত ফাইল নির্দিষ্ট করতে হবে না
কুগার

1
আমি একাধিক এক্সটেনশন কীভাবে অন্তর্ভুক্ত করব? যেমন। "* .সিপি", "* .হ"?
টম্যা জ্যাটো - মনিকা

1
@ টোম জাটো, *: এর পরিবর্তে আপনার সমস্ত ফাইলের ধরণ সরবরাহ করুন grep $PATTERN *.cpp *.h। কোন ফাইলগুলি গ্রেপ করা উচিত তার জন্য যদি আপনার আরও নির্দিষ্ট বিধিগুলির প্রয়োজন হয় তবে findকমান্ডটি ব্যবহার করুন (রবের উত্তর পরীক্ষা করুন) check
umi

@mi আমি চালিত হলে grep -r x .সমস্ত এক্সটেনশনের সমস্ত ফাইল থেকে ফলাফল আসে come আমি যদি রান করি তবে আমি grep -r x *.scssকোনও ফল পাই না।
ক্রিস

1
@ ক্রিস এটি সম্ভব আপনার *.scssবর্তমান ডিরেক্টরিতে ফাইল না থাকলেও কোথাও গভীরে সাবডিয়ার রয়েছে যাতে গ্রেপ আপনার চাওয়া সমস্ত ফাইলে দেখে না। --includeনির্দিষ্ট প্যাটার্নগুলির সাথে মেলে এমন ফাইলগুলির জন্য পুনরাবৃত্তভাবে নজর দেওয়ার জন্য আপনার গ্রেপকে বলতে বিকল্পটি ব্যবহার করা উচিত : grep -r x --include '*.scss' . (উদ্ধৃতিগুলি নোট করুন, তারা শেলটি দিয়ে প্যাটার্নটি প্রসারিত হতে বাধা দেয়)। অথবা কেবল ব্যবহার করুন find(রবের উত্তর দেখুন)।
umi

168

লিনাক্সে, আমি সাধারণত এই কমান্ডটি একটি ডিয়ারের মধ্যে নির্দিষ্ট পাঠ্যের জন্য পুনরাবৃত্তভাবে গ্রেপ করতে ব্যবহার করি

grep -rni "string" *

কোথায়,

r = পুনরাবৃত্ত অর্থাৎ, বর্তমান ডিরেক্টরিতে সাব ডাইরেক্টরিগুলি অনুসন্ধান করুন
n = স্টাডাউট
আই = কেস সংবেদনশীল অনুসন্ধানের জন্য লাইন নম্বর মুদ্রণ করতে


32

ব্যবহার করুন। গুরুতরভাবে, এটি সর্বোত্তম উপায় কারণ এরপরে আপনি সত্যিই দেখতে পারবেন এটি কোন ফাইলগুলিতে কাজ করছে:

find . -name "*.sql" -exec grep -H "slow" {} \;

দ্রষ্টব্য, -H ম্যাক-নির্দিষ্ট, ফলাফলের মধ্যে ফাইলের নামটি প্রদর্শন করে।


7
যদি আপনি সন্ধানটি ব্যবহার করার সিদ্ধান্ত নেন, তবে এটি ব্যবহারের xargsপরিবর্তে আউটপুটটি পাইপ -execকরা আরও দ্রুত হবে, কারণ -execপ্রতিটি গ্রেপের জন্য একটি নতুন প্রক্রিয়া তৈরি হয় এবং প্রচুর সংখ্যক ফাইলের সাথে ওভারহেড তাৎপর্যপূর্ণ হয়ে ওঠে। ফাইলের নামের জায়গাগুলি সম্পর্কে স্ট্যান্ডার্ড সতর্কতাগুলি প্রযোজ্য xargs
বার্টন চিত্তেনডেন

2
এই দেখতে কি ঠিক মত হবে? আমি সবসময় xargsসিনট্যাক্স ভুলে যাই
ব্রায়ান পিটারসন

3
@ ব্রায়ান পিটারসন এটির মতো কিছু হবে:find . -iname "*.sql" -print0 | xargs -0 grep "slow"
মিডিয়াভিস

4

সমস্ত উপ-ডিরেক্টরিতে অনুসন্ধান করতে, তবে কেবলমাত্র নির্দিষ্ট ফাইল প্রকারের সাথে , গ্রেপ ব্যবহার করুন --include

উদাহরণস্বরূপ, বর্তমান ডিরেক্টরিতে পুনরাবৃত্তভাবে অনুসন্ধান করা, *। জিমেল এবং * .আইএমএল পাঠ্যের জন্য:

grep "text to search" -r . --include=*.{yml,yaml}

1

আপনি যদি একাধিক আদেশ করতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

for I in `ls *.sql`
do
    grep "foo" $I >> foo.log
    grep "bar" $I >> bar.log
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.