রেকর্ডের জন্য, আমি যে পছন্দটিকে পছন্দ করি তা এখানে:
grep pattern $(find . -type f ! -path './test/main.cpp')
grepকমান্ডের শুরুতে রেখে , আমি মনে করি এটি কিছুটা স্পষ্ট - প্লাস এটি grepরঙিন হাইলাইটিং অক্ষম করে না । এক অর্থে, findকমান্ড-প্রতিস্থাপনে ব্যবহার করা grepএর কার্যকারিতাটির (সীমাবদ্ধ) ফাইল-সন্ধানের উপসেটটি বাড়ানো / প্রতিস্থাপনের এক উপায় ।
আমার কাছে find -execসিনট্যাক্স এক ধরণের আরকেন। এর মধ্যে একটি জটিলতা find -execহ'ল (কখনও কখনও) বিভিন্ন চরিত্রের পালানোর প্রয়োজন (বিশেষত যদি \;বাশের অধীনে ব্যবহৃত হয়)। জিনিসগুলিকে পরিচিত প্রসঙ্গে রেখে দেওয়ার উদ্দেশ্যে, নিম্নলিখিত দুটি কমান্ড মূলত সমতুল্য:
find . ! -path ./test/main.cpp -type f -exec grep pattern {} +
find . ! -path ./test/main.cpp -type f -print0 |xargs -0 grep pattern
আপনি যদি সাব-ডিরেক্টরিগুলি বাদ দিতে চান তবে একটি ওয়াইল্ডকার্ড ব্যবহার করা প্রয়োজন হতে পারে। আমি এখানে স্কিমাটি পুরোপুরি বুঝতে পারি না - আরকেন সম্পর্কে কথা বলি :
grep pattern $(find . -type f ! -path './test/main.cpp' ! -path './lib/*' )
স্ক্রিপ্টগুলিতে ব্যবহারের জন্যfind ভিত্তিক সমাধানগুলি সাধারণকরণের জন্য আরও একটি নোট : grepকমান্ড-লাইনে -H/ --with-filenameবিকল্পটি অন্তর্ভুক্ত করা উচিত । অন্যথায় এটি এই পরিস্থিতিতে আউটপুট ফর্ম্যাটিকে পরিবর্তন করবে যে সন্ধানের ফলাফলগুলিতে কেবলমাত্র একটি ফাইলের নাম থাকতে পারে find। এটি উল্লেখযোগ্য কারণ এটি যদি প্রয়োজনীয় হয় না তবে এটির প্রয়োজনীয় grepফাইল-সন্ধান ( -rবিকল্পের সাথে) ব্যবহার করে।
... আরও ভাল, যদিও /dev/nullঅনুসন্ধানের জন্য প্রথম ফাইল হিসাবে অন্তর্ভুক্ত করা উচিত। এটি দুটি সমস্যার সমাধান করে:
- এটি সুনিশ্চিত করে যে অনুসন্ধানের জন্য যদি একটি ফাইল থাকে, তবে সেখানে
grepদুটি আছে এবং একাধিক-ফাইল আউটপুট মোড ব্যবহার করবে will
- এটি সুনিশ্চিত করে যে যদি অনুসন্ধানের জন্য কোনও ফাইল না থাকে তবে তারা
grepমনে করবে যে সেখানে একটি ফাইল আছে এবং স্টিডিনের জন্য অপেক্ষা না করে।
সুতরাং চূড়ান্ত উত্তরটি হ'ল:
grep pattern /dev/null $(find . -type f ! -path './test/main.cpp')
--exclude-dir) বাদ দিতে চাইলে সমস্যাটি বড় হয়ে যায় । এজন্য আমি গ্রিপকে দেশীয়ভাবে বাদ দেওয়ার চেষ্টা করতে চাই।