আমি নিশ্চিত নই:
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
এসগুলি তাদের আউটপুটটি বাফার শুরু করবে যার অর্থ এই grep
s গুলিটির আউটপুট সম্ভবত ভুলভাবে ইন্টারলিভড হবে। আপনার 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 {} +