আমি নিশ্চিত নই:
grep -r -i 'the brown dog' /*
সত্যিই আপনি বোঝাতে চেয়েছিলেন এর অর্থ হ'ল সমস্ত অ গোপনীয় ফাইল এবং ডায়ারগুলিতে পুনরাবৃত্তির সাথে গ্রেপ হওয়া উচিত /(তবে তারপরেও লুকানো ফাইল এবং ডায়ারের ভিতরে তাকান)।
ধরে নিচ্ছেন আপনার অর্থ:
grep -r -i 'the brown dog' /
কয়েকটি বিষয় লক্ষণীয়:
- সমস্ত
grepবাস্তবায়ন সমর্থন করে না -r। এবং যাগুলির মধ্যে, আচরণগুলির মধ্যে পার্থক্য রয়েছে: কেউ কেউ ডিরেক্টরি ট্রিতে যাওয়ার সময় ডিরেক্টরিগুলির প্রতিলিঙ্কগুলি অনুসরণ করেন (যার অর্থ আপনি একই ফাইলটিতে বেশ কয়েকবার সন্ধান করতে পারেন বা এমনকি অসীম লুপগুলিতে চালাতে পারেন), কিছু না will কিছু ডিভাইস ফাইলের ভিতরে দেখতে পাবেন (এবং এটি /dev/zeroউদাহরণস্বরূপ বেশ কিছুটা সময় নেবে ) বা পাইপ বা বাইনারি ফাইলগুলি ..., কিছু না not
grepফাইলগুলি আবিষ্কার করার সাথে সাথে এটি ভিতরে সন্ধান করা শুরু করার সাথে সাথে এটি দক্ষ । তবে এটি কোনও ফাইলে সন্ধান করার সময়, অনুসন্ধানের জন্য এটি আর বেশি ফাইলের সন্ধান করে না (যা সম্ভবত বেশিরভাগ ক্ষেত্রে ঠিক একইভাবে হয়)
তোমার:
find / -type f -exec grep -i 'the brown dog' {} \;
( -rযা এখানে বোঝা যায়নি এটি মুছে ফেলা হয়েছে) মারাত্মকভাবে অক্ষম কারণ আপনি grepপ্রতি ফাইলের মধ্যে একটি চালাচ্ছেন । ;কেবলমাত্র একটি যুক্তি গ্রহণকারী কমান্ডগুলির জন্য ব্যবহার করা উচিত। grepতবুও এখানে, কারণ কেবল একটি ফাইলে দেখায়, এটি ফাইলটির নাম মুদ্রণ করবে না, তাই ম্যাচগুলি কোথায় তা আপনি জানতে পারবেন না।
আপনি ডিভাইস ফাইল, পাইপ, সিমলিংকের ভিতরে খুঁজছেন না ..., আপনি সিমলিংকগুলি অনুসরণ করছেন না, তবে আপনি এখনও সম্ভাব্যভাবে পছন্দ মতো জিনিসগুলি সন্ধান করছেন /proc/mem।
find / -type f -exec grep -i 'the brown dog' {} +
অনেক ভাল হবে কারণ grepযতটা সম্ভব কমান্ড চালানো হবে। শেষ রানটিতে কেবল একটি ফাইল না থাকলে আপনি ফাইলটির নাম পাবেন। তার জন্য এটি ব্যবহার করা ভাল:
find / -type f -exec grep -i 'the brown dog' /dev/null {} +
বা জিএনইউ সহ grep:
find / -type f -exec grep -Hi 'the brown dog' {} +
মনে রাখবেন যে এটি চিবানোর জন্য পর্যাপ্ত ফাইল grepনা findপাওয়া পর্যন্ত শুরু করা হবে না , তাই প্রাথমিকভাবে কিছুটা বিলম্ব হবে। আর findএকাধিক ফাইল অনুসন্ধানের জন্য পর্যন্ত পূর্ববর্তী বহন করা হবে না grepফিরে এসেছে। বড় ফাইল তালিকার বরাদ্দ করা এবং পাস করার কিছু প্রভাব রয়েছে (সম্ভবত নগণ্য), সুতরাং এটি সমস্ত কিছু সম্ভবত এটির চেয়ে কম দক্ষ হতে grep -rচলেছে যা সিমলিংক অনুসরণ করে না বা ডিভাইসগুলির অভ্যন্তরে দেখতে পাবে না।
জিএনইউ সরঞ্জাম সহ:
find / -type f -print0 | xargs -r0 grep -Hi 'the brown dog'
উপরে হিসাবে, যতটা grepসম্ভব উদাহরণস্বরূপ চালানো হবে, তবে findপ্রথম grepপ্রার্থনা প্রথম ব্যাচের ভিতরে থাকা অবস্থায় আরও ফাইল অনুসন্ধান করা চালিয়ে যাবে । যদিও এটি একটি সুবিধা হতে পারে বা নাও পারে। উদাহরণস্বরূপ, আবর্তনশীল হার্ড ড্রাইভ সঞ্চিত ডেটা সঙ্গে findএবং grepডিস্কে বিভিন্ন অবস্থানগুলি এ সঞ্চিত অ্যাক্সেস ডেটা প্রতিনিয়ত সরাতে ডিস্ক মাথা ঘটাচ্ছে দ্বারা ডিস্ক থ্রুপুট মন্থর করে দেবে। একটি RAID সেটআপে (যেখানে findএবং grepবিভিন্ন ডিস্ক অ্যাক্সেস করতে পারে) বা এসএসডিগুলিতে, এটি একটি ইতিবাচক পার্থক্য করতে পারে।
একটি RAID সেটআপে, বেশ কয়েকটি সমবর্তী grep আমন্ত্রণ চালানো জিনিসগুলির উন্নতিও করতে পারে। এখনও 3 টি ডিস্ক সহ RAID1 স্টোরেজে জিএনইউ সরঞ্জাম সহ,
find / -type f -print0 | xargs -r0 -P2 grep -Hi 'the brown dog'
পারফরম্যান্স উল্লেখযোগ্যভাবে বৃদ্ধি করতে পারে। তবে খেয়াল করুন যে দ্বিতীয় কমান্ডটি grepপূরণ করার জন্য পর্যাপ্ত ফাইলগুলি পাওয়া গেলেই কেবল দ্বিতীয়টি শুরু করা হবে grep। তাড়াতাড়ি -nহওয়ার xargsজন্য আপনি একটি বিকল্প যুক্ত করতে পারেন (এবং প্রার্থনার জন্য কম ফাইলগুলি পাস করুন grep)।
এছাড়াও মনে রাখবেন যে আপনি যদি xargsটার্মিনাল ডিভাইস ব্যতীত আউটপুটটিকে অন্য কোনও দিকে পুনঃনির্দেশ করে থাকেন তবে grepsএসগুলি তাদের আউটপুটটি বাফার শুরু করবে যার অর্থ এই greps গুলিটির আউটপুট সম্ভবত ভুলভাবে ইন্টারলিভড হবে। আপনার stdbuf -oLচারপাশে কাজ করার জন্য তাদের (যেখানে জিএনইউ বা ফ্রিবিএসডি-র মতো উপলব্ধ) ব্যবহার করতে হবে (আপনার এখনও খুব দীর্ঘ লাইন (সাধারণত> 4KiB) নিয়ে সমস্যা হতে পারে) বা প্রত্যেকে একটি আলাদা ফাইলে তাদের আউটপুট লিখতে এবং তাদের সাথে একমত করতে পারেন সব শেষে।
এখানে, আপনি যে স্ট্রিংটির সন্ধান করছেন তা স্থির হয়েছে (একটি রেজিপ্সপ নয়) সুতরাং -Fবিকল্পটি ব্যবহার করে কোনও পার্থক্য হতে পারে ( grepবাস্তবায়নের ফলে ইতিমধ্যে কীভাবে এটি অপ্টিমাইজ করতে হয় তা অসম্ভব )।
আরেকটি জিনিস যা একটি বড় পার্থক্য করতে পারে তা হ'ল আপনি যদি কোনও বহু-বাইট লোকালে থাকেন তবে সিটিতে লোকাল ঠিক করা:
find / -type f -print0 | LC_ALL=C xargs -r0 -P2 grep -Hi 'the brown dog'
ভিতরে অনুসন্ধান এড়াতে /proc, /sys..., -xdevআপনি অনুসন্ধান করতে চান ফাইল সিস্টেমটি ব্যবহার করুন এবং নির্দিষ্ট করুন:
LC_ALL=C find / /home -xdev -type f -exec grep -i 'the brown dog' /dev/null {} +
বা আপনি যে পথগুলি স্পষ্টভাবে বাদ দিতে চান তা ছাঁটাই করুন:
LC_ALL=C find / \( -path /dev -o -path /proc -o -path /sys \) -prune -o \
-type f -exec grep -i 'the brown dog' /dev/null {} +