যদি আপনি অনুমতি সম্পর্কে ত্রুটি পেয়ে থাকেন (তবে আপনি বলছেন না যে আপনি করেন) তবে আপনি অনুমান করছেন যে আপনি হয় মূল ডিরেক্টরিতে ( /) বা এমন কোনও পথে দাঁড়িয়ে আছেন যেখানে আপনার কাছে সমস্ত ফাইল পড়ার অনুমতি নেই, হিসেবে যেমন /etcঅথবা /var। তবে আপনি যেহেতু বলছেন এটি একটি অত্যন্ত দীর্ঘ সময় নেয় তাই আমি প্রথম অনুমানের (মূল ডিরেক্টরি) দিকে আরও ঝুঁকছি।
আপনি যদি পুরো সিস্টেমে একেবারে সমস্ত ফাইল অনুসন্ধান করতে চান তবে আপনি যা করছেন তা বেশ সঠিক। এটা তোলে করবে একটি দীর্ঘ সময় কোন ব্যাপার আপনি কি করবেন নিতে। এটি অনুসন্ধানের জন্য কেবলমাত্র একটি ভয়ঙ্কর ফাইল।
আপনি দেখতে findফাইলের পরিমাণ সঙ্কুচিত করতে ব্যবহার করতে পারেন ।
এই মুহূর্তে, আপনার আছে
$ find . -name "*.txt" | xargs grep texthere
যেহেতু দেখে মনে হচ্ছে আপনি কেবল প্লেইন পাঠ্য ফাইলগুলিতে আগ্রহী তাই আমরা অন্য কোনও ধরণের ফাইল (এক্সিকিউটেবল) বাদ দিতে পারি:
$ find / -type f \! -perm -o=x -name "*.txt" | xargs grep texthere
আমি প্রতিস্থাপিত .সঙ্গে /, এখানে যে কারণ আমি কোথায় মনে হয় (আমি হলে শুধরে আমি ভুল)। আমি আরও উল্লেখ করছি যে আমি ফাইলগুলি ( -type f) যা এক্সিকিউটেবল ( \! -perm -o=x) ( !আপনার শেল এটির সাথে মজার কাজ না করে) এড়াতে হবে want
এখন, আমরা আরও কিছু কাজ করতে পারি। একটি হ'ল একটি সুরক্ষার জিনিস এবং অন্যটি সম্ভবত গতিকে সামান্য কিছুটা উন্নত করতে পারে ।
কিছু ফাইলের নামগুলিতে শূন্যস্থান থাকতে পারে, বা অন্যান্য জঞ্জাল চরিত্র যা আমরা সাধারণত ফাইলের নামগুলিতে চাই না। এগুলি যথাযথভাবে পাস করতে সক্ষম হওয়ার জন্য findএবং grepআমরা করি
$ find / -type f \! -perm -o=x -name "*.txt" -print0 | xargs -0 grep texthere
এর ( -print0) অর্থ প্রতিটি ফাইলের নাম স্পেস অক্ষরের পরিবর্তে একটি nulঅক্ষর ( \0) দ্বারা সীমাবদ্ধ করা হবে । এবং xargsএই হিসাবে- nulসীমাবদ্ধ ফাইলের নামগুলি প্রাপ্ত করার জন্য সম্পর্কিত বিকল্পটি হ'ল -0।
কারণ আপনি সেই দুটি বিকল্প ব্যবহার করছেন না বলে আমার বিশ্বাস আপনি এই "কোনও ফাইল বা ডিরেক্টরি নেই" ত্রুটি পেয়েছেন।
গতি জিনিস fgrep। এটি এমন একটি ইউটিলিটি যা grep -Fআপনার সন্ধানের স্ট্রিংটিতে কোনও নিয়মিত এক্সপ্রেশন না থাকলে কোনও সরল পাঠ্য স্ট্রিং হলে আপনার ব্যবহার করা উচিত এর ঠিক সমান ।
সুতরাং, আপনার যদি একটি সরল পাঠ্য স্ট্রিং থাকে এবং আপনি এটি পুরো সিস্টেমের প্রতিটি ফাইলে সন্ধান করতে চান:
$ find / -type f \! -perm -o=x -name "*.txt" -print0 | xargs -0 fgrep texthere
অনুমতি জিনিস ... অবশ্যই এমন ফাইল থাকবে যা আপনি পড়তে পারবেন না। আপনি হয় চালাতে পারেন findএবং তাদের কাছে চালিত fgrepরেখে sudo:
$ sudo find ... | xargs -0 sudo fgrep texthere
অথবা আপনি এর -permজন্য অন্য পতাকাটি কারুকাজ করার চেষ্টা করতে পারেন find(এবং এটিতে যে ডিরেক্টরিগুলি আপনি প্রবেশ করতে পারবেন না সেগুলি এড়ানোও এটি পেতে পারেন) তবে এটি খুব বেশি সময়সাপেক্ষ এবং এটি একটি হাস্যকরভাবে দীর্ঘ কমান্ড লাইনের ফলস্বরূপ হবে, তাই আমি এখানে এটি করব না।
অথবা আপনি কেবল sudo -sএকটি রুট শেল পেতে এবং সেখান থেকে জিনিসটি চালাতে পারবেন ... তবে আমি সাধারণত এর বিরুদ্ধে পরামর্শ দেব কারণ লোকেরা তাদের সিস্টেমগুলি ভুলে গিয়ে তাদের গণ্ডগোল করার প্রবণতা রয়েছে root।
অন্য কোনও সমাধান হ'ল পুরো সিস্টেমের locateসমস্ত .txtফাইল সনাক্ত করতে কমান্ডটি ব্যবহার করা । locateকমান্ড ফাইল অনুক্রমের অনুসন্ধান করে না কিন্তু এর পরিবর্তে একটি ডাটাবেস (সাধারণত প্রতিদিন আপডেট করা হয় যা, তাই ব্যবহার সব ফাইল হতে পারে)। ডাটাবেসটিতে সমস্ত ব্যবহারকারীদের দ্বারা অ্যাক্সেসযোগ্য ডিরেক্টরিগুলিতে ফাইল থাকে না, সুতরাং আপনি যদি নিজের ডিরেক্টরিতে পঠন-অনুমতিগুলি সরিয়ে ফেলে থাকেন তবে আপনার ফাইলগুলি সেখানে থাকবে না।
সুতরাং, findউপরের কমান্ডটি locateপ্রায় সমমানের সাথে প্রতিস্থাপন করুন :
$ locate '*.txt' -0 | xargs -0 fgrep texthere
-0বিকল্প (অথবা --nullকিছু সিস্টেমে দিকে) অনুরূপ --print0বিকল্প find।
grep?