যখন আমি কিছু সামগ্রীর জন্য একটি সম্পূর্ণ গাছ অনুসন্ধান করতে চাই, আমি ব্যবহার করি
find . -type f -print0 | xargs -0 grep <search_string>
পারফরম্যান্স বা ব্রেভিটির ক্ষেত্রে এটি করার আরও ভাল উপায় কী?
যখন আমি কিছু সামগ্রীর জন্য একটি সম্পূর্ণ গাছ অনুসন্ধান করতে চাই, আমি ব্যবহার করি
find . -type f -print0 | xargs -0 grep <search_string>
পারফরম্যান্স বা ব্রেভিটির ক্ষেত্রে এটি করার আরও ভাল উপায় কী?
উত্তর:
আপনার grep
সমর্থন -r
বিকল্প ( পুনরাবৃত্তি জন্য ) পরীক্ষা করুন:
grep -r <search_string> .
--exclude-dir
সম্পাদনা সম্পাদনা সম্পর্কে একটি মন্তব্য যুক্ত করুন এবং আমাদের একটি বিজয়ী আছে!
grep
সাম্প্রতিক ফ্রিবিএসডি এবং লিনাক্স এটিকে সমর্থন করে। আর কেন --exclude-dir
? আপনি পুরো গাছটি অনুসন্ধান করতে বলেননি ?
--exclude-dir
আসলে আমার ব্যবহারের ক্ষেত্রে কার্যকর (কারণ সাবট্রির অংশগুলি বড়, তবে অকেজো) এবং আমি অভিনয় সম্পর্কে জিজ্ঞাসা করেছি ... তবে আপনি ঠিক বলেছেন, এটি প্রয়োজনীয় নয়।
--exclude-dir
সাথে একচেটিয়া grep
। (-:
একটি সাব অনুকূল উত্তর: আউটপুট বংশীধ্বনিতুল্য পরিবর্তে find
মধ্যে grep
, আপনি শুধু চালাতে পারে
find . -type f -exec grep 'research' {} '+'
এবং ভয়েলা, দু'জনের পরিবর্তে এক আদেশ!
ব্যাখ্যা:
find . -type f
এর মধ্যে সমস্ত নিয়মিত ফাইল সন্ধান করুন।
-exec grep 'research'
গ্রেপ 'গবেষণা'
{}
পাওয়া ফাইলের নাম
'+'
সমস্ত ফাইল নাম অনুসারে একটি কমান্ড ব্যবহার করুন, একবার ফাইলের নাম হিসাবে নয়।
নোট: ';'
এটির সাথে ফাইল নাম অনুসারে একবার হত।
আপনি যদি সোর্স কোড প্রসেস করতে এটি ব্যবহার করেন তবে আপনি ack
কোড বিটগুলি সহজেই সন্ধান করার জন্য তৈরি করা যেতে পারে।
সম্পাদনা করুন:
আপনি এই গবেষণাটি আরও বাড়িয়ে নিতে পারেন। প্রথমে, আপনি নির্দিষ্ট নামকরণের ধরণ সহ ফাইলগুলি সন্ধান করার জন্য -name ''
স্যুইচটি ব্যবহার করতে পারেন find
।
এই ক্ষেত্রে :
শুধুমাত্র লগগুলির সাথে সম্পর্কিত ফাইলগুলি: -name '*.log'
কেবলমাত্র সি ফাইলগুলি যা সি শিরোনামগুলির সাথে সম্পর্কিত, তবে আপনি নিজের ফাইলের নাম এক্সটেনশনের জন্য বড় হাতের বা ছোট হাতের সাথে আটকে রাখতে পারবেন না: -iname *.c
নোট: পছন্দ করুন grep
এবং ack
, -i
স্যুইচ মানে এই ক্ষেত্রে ক্ষেত্রে সংবেদনশীল।
সেক্ষেত্রে গ্রেপ বর্ণ ছাড়াই এবং লাইন নম্বর ছাড়াই প্রদর্শিত হবে।
আপনি এটি --color
এবং -n
স্যুইচ (ফাইলগুলিতে যথাক্রমে রঙ এবং রেখার সংখ্যা) দিয়ে এটি পরিবর্তন করতে পারেন ।
শেষ পর্যন্ত, আপনার মতো কিছু থাকতে পারে:
find . -name '*.log' -type f -exec grep --color -n 'pattern' {} '+'
এই ক্ষেত্রে
$ find . -name '*.c' -type f -exec grep -n 'hello' {} '+'
./test2/target.c:1:hello
-name '*.log'
এটি ফিল্টার দিয়ে পছন্দ করি যেমন এটি দ্রুত।
আপনি যদি সাব-ডিরেক্টরিতে পুনরাবৃত্তি করতে চান:
grep -R 'pattern' .
-R
বিকল্প একটি প্রমিত বিকল্প নয়, কিন্তু সবচেয়ে সাধারণ দ্বারা সমর্থিত grep
বাস্তবায়নের।
-r
-R
grep
বাস্তবায়নগুলি পুনরাবৃত্তিগুলি ধরে, আমি মনে করি। অন্যথায় এটি "গাছ" বলতে কী বোঝায় তার উপর নির্ভর করে।
grep
উচিত নয়। ব্যবহারকারীর যদি তাদের ডিরেক্টরি কাঠামোতে প্রতীকী লিঙ্ক লুপ থাকে তবে ভাল, এটি ব্যবহারকারীর সমস্যা :-)
/sys/devices/cpu/subsystem/devices/cpu/subsystem/devices/cpu/...
(টুলস মত -XI আমাকে (কোলাহল যদি না তারা অদ্ভুত যাদু প্রদান তাদের "এআই") কল (-;।
উপরে উল্লিখিত হিসাবে -r
বা -R
(কাঙ্ক্ষিত সিমলিংক হ্যান্ডলিংয়ের উপর নির্ভর করে) একটি দ্রুত বিকল্প।
তবে -d <action>
সময়ে সময়ে দরকারী হতে পারে।
দুর্দান্ত জিনিসটি -d
হ'ল স্কিপ কমান্ড, যখন আপনি কেবলমাত্র বর্তমান স্তরটি স্ক্যান করতে চান "গ্রেপ: ডিরেক্টরি_নাম: একটি ডিরেক্টরি"।
$ grep foo *
grep: q2: Is a directory
grep: rt: Is a directory
$ grep -d skip foo *
$
এবং অবশ্যই:
$ grep -d recurse foo *
(list of results that don't exist because the word foo isn't in our source code
and I wouldn't publish it anyway).
$
-d skip
বিকল্প অন্য স্ক্রিপ্ট ভিতরে সত্যিই সুবিধাজনক যাতে আপনাকে কোনো না 2> /dev/null
। :)
আপনি যদি অনেকগুলি ফাইলের সাথে কাজ করে থাকেন তবে সাবফোল্ডারগুলিতে সমস্ত ফাইল গ্রেপ না করে অনুসন্ধানের জন্য প্রয়োজনীয় ফাইলগুলি ছাঁটাই করে ফেললে গ্রেপ দ্রুত চলে।
আমি কখনও কখনও এই ফর্ম্যাটটি ব্যবহার করি:
grep "primary" `find . | grep cpp$`
এর .
শেষের সাবফোল্ডারে সমস্ত ফাইল সন্ধান করুনcpp
। তারপরে "প্রাথমিক" ফাইলগুলির জন্য গ্রেপ করুন।
আপনি যদি চান তবে আপনি সেই ফলাফলগুলি আরও গ্রেপ কলগুলিতে পাইপ করতে পারেন:
grep "primary" `find . | grep cpp$` | grep -v "ignoreThis" | grep -i "caseInsensitiveGrep"