পুরো ফাইল সিস্টেমের মধ্যে কীভাবে টেক্সট সন্ধান করবেন?


53

গ্রেপ টুলটি ব্যবহার করা উচিত বলে ধরে নিচ্ছি, আমি পুরো ফাইল সিস্টেমটিতে "800x600" পাঠ্য স্ট্রিংটি অনুসন্ধান করতে চাই।

আমি চেষ্টা করেছিলাম:

grep -r 800x600 /

কিন্তু এটি কাজ করে না।

আমার বিশ্বাস যা করা উচিত তা হ'ল "800x600" পাঠ্যের জন্য মূল হিসাবে থাকা সমস্ত ফাইল / ফোল্ডারগুলিকে পুনরাবৃত্তভাবে গ্রেপ করা উচিত এবং অনুসন্ধান ফলাফলগুলি তালিকাভুক্ত করুন।

আমি কি ভুল করছি?


2
এবং "এটি কাজ করে না" দ্বারা আপনি ঠিক কি বোঝাতে চান? এটি কোনও আউটপুট, হ্যাং বা প্রচুর Permission deniedত্রুটি মুদ্রণ করে না ? আপনি কি এটি রুট বা একটি সাধারণ ব্যবহারকারী হিসাবে চালিত করেছেন?
অ্যালেক্স

আমি কিছুটা ট্র্যাকশন পাচ্ছি, সবার আগে আমি আমার ব্যবহারকারীর হোম ডিরেক্টরিতে কমান্ডটি চালানোর চেষ্টা করছিলাম। সুতরাং এখন আমি সিডি / আউট রুট। এরপরে আমি উপরের মত একই কমান্ডটি চেষ্টা করেছি এবং আমি প্রচুর অনুমতি ত্রুটিগুলি বঞ্চিত করছি। ঠিক আছে, তাই এখন আমি sudo grep -r 800x600 / চেষ্টা করি এবং তারপরে আমি একটি / proc /
sysrq-

হুম, জানিনা কেন এটি কাজ করবে না। আপনি না করে অ্যাক্সেস ত্রুটি উপেক্ষা করতে পারেন grep -r 800x600 / 2>/dev/null। আপনি এটিকে মূল হিসাবে চালানোর চেষ্টা করতে পারেন।
টোটার

উত্তর:


64

আমি সাধারণত grepবেশ কয়েকটি ফাইল চালাতে এই স্টাইলের কমান্ড ব্যবহার করি :

find / -xdev -type f -print0 | xargs -0 grep -H "800x600"

এটি আসলে যা করে তা হ'ল সিস্টেমে প্রতিটি ফাইলের একটি তালিকা তৈরি করা এবং তারপরে প্রতিটি ফাইলের জন্য grepপ্রদত্ত যুক্তি এবং প্রতিটি ফাইলের নাম দিয়ে সম্পাদন করা।

-xdevযুক্তি বলে যে এটি অন্যান্য ফাইল সিস্টেম উপেক্ষা করতে হবে - এই যেমন বিশেষ ফাইল সিস্টেম এড়ানো জন্য ভাল /proc। তবে এটি সাধারণ ফাইল সিস্টেমগুলিকেও এড়িয়ে যাবে - সুতরাং, উদাহরণস্বরূপ, যদি আপনার / হোম ফোল্ডারটি পৃথক পার্টিশনে থাকে তবে এটি অনুসন্ধান করা হবে না - আপনাকে বলতে হবে find / /home -xdev ...

-type fমানে কেবল ফাইল অনুসন্ধান করুন, সুতরাং ডিরেক্টরি, ডিভাইস এবং অন্যান্য বিশেষ ফাইল উপেক্ষা করা হবে (এটি এখনও ডিরেক্টরিতে পুনরাবৃত্তি করবে এবং এর grepমধ্যে থাকা ফাইলগুলিতে এক্সিকিউট করবে - এটি কেবল ডিরেক্টরিতে চালিত হবে না grep, যা কোনওভাবে কাজ করবে না)) এবং এর আউটপুটটিতে সর্বদা ফাইলের নাম মুদ্রণ -Hকরতে grepবলার বিকল্প ।

findফাইলগুলির তালিকা ফিল্টার করতে সকল ধরণের বিকল্প গ্রহণ করে। উদাহরণস্বরূপ, -name '*.txt'কেবলমাত্র টেক্সটে শেষ হওয়া ফাইলগুলি প্রক্রিয়া করে। -size -2Mএর অর্থ ফাইলগুলি যা 2 মেগাবাইটের চেয়ে ছোট। -mtime -5মানে গত পাঁচ দিনে ফাইলগুলি সংশোধিত হয়েছে। এই জন্য -a সঙ্গে একসঙ্গে যোগদান এবং এবং জন্য কি- O বা , এবং ব্যবহার '('প্রথম বন্ধনী ')'(তাদের ব্যাখ্যা থেকে খোলসের প্রতিরোধ উদ্ধৃতির মধ্যে) গ্রুপ এক্সপ্রেশন করতে। উদাহরণস্বরূপ:

find / -xdev '(' -type f -a -name '*.txt' -a -size -2M -a -mtime -5 ')' -print0 | xargs -0 grep -H "800x600"

man findসম্ভাব্য ফিল্টারগুলির সম্পূর্ণ তালিকা দেখতে একবার দেখুন।


2
দ্রষ্টব্য যে -xdevকেবলমাত্র বিশেষগুলি নয়, অন্যান্য সমস্ত ফাইল সিস্টেমকে বাদ দেবে । (যেমন, আপনি যদি /homeপৃথক বিভাজন হিসাবে মাউন্ট করেছেন তবে এটি অনুসন্ধান করা হবে না)
সিজেএম

আমি প্রত্যেকে চালানোর চেষ্টা করেছিলাম তবে দুজনেই একটি ত্রুটি ফিরিয়ে find: paths must precede expression: /
দিয়েছি

1
দ্রষ্টব্য: যখন নিয়মিত এক্সপ্রেশন প্রয়োজন হয় না তখন 'গ্রেগ' এর তুলনায় 'fgrep' উল্লেখযোগ্যভাবে দ্রুত হয়, আপনি যদি একটি বড় গাছ সন্ধান করেন তবে এটি একটি বড় পার্থক্য করবে।
নাথান কিড

1
আপনি xargsসম্ভবত আরও ভাল দক্ষতা দিয়ে এড়াতে পারেন find / -xdev -type f -exec grep -H '800x600' +
টোটার

3
না, কমান্ডের +শেষে চিহ্নটি findআসলে একই কাজ করে xargs: এটি grepবেশ কয়েকটি যুক্তি দিয়ে একটি প্রক্রিয়া তৈরি করে।
টোটার

14

সাধারণত আপনি আসলে সিস্টেমে সমস্ত কিছুই অনুসন্ধান করতে চান না। লিনাক্স সমস্ত কিছুর জন্য ফাইল নোড ব্যবহার করে, তাই কিছু "ফাইল" এমন জিনিস নয় যা আপনি অনুসন্ধান করতে চান। উদাহরণস্বরূপ /dev/sdaআপনার প্রথম হার্ড ড্রাইভের শারীরিক ব্লক ডিভাইস। আপনি সম্ভবত কাউন্ট ডিস্ক ডিভাইস নয়, মাউন্ট করা ফাইল সিস্টেমগুলি অনুসন্ধান করতে চান। এছাড়াও এটি রয়েছে /dev/randomযা প্রতিবার এটি পড়ার সময় এলোমেলো ডেটা ছড়িয়ে দেয়। এটি অনুসন্ধান করা খুব একটা অর্থবোধ করে না। /procফাইল সিস্টেম এছাড়াও আপনার ক্ষেত্রে সমস্যাযুক্ত।

আমি দুটি জিনিস একটি recomend হবে।

  1. রুটে অনুসন্ধান করবেন না, কেবল সেই জায়গাগুলি অনুসন্ধান করুন যা দরকারী হতে পারে। অনুসন্ধান করুন /homeবা /usrবা /etcseparatly। আপনি যে তথ্যটি অনুসন্ধান করছেন এটি কোনও নির্দিষ্ট ধরণের সম্ভবত, সুতরাং এটি কোনও নির্দিষ্ট ফোল্ডারে থাকার সম্ভাবনা রয়েছে। কনফিগারেশন সেটিংস থাকা উচিত /etc। আপনার ব্যক্তিগত ডেটা ফাইল থাকা উচিত /home। এর মতো কোনও প্রধান অঞ্চলে অনুসন্ধান সীমাবদ্ধ করা পুনরাবৃত্ত গ্রিপগুলির সাহায্যে আপনার সমস্যাগুলি হ্রাস করবে।

  2. সমস্যাযুক্ত ক্ষেত্রগুলি ব্যবহার করে --exclude-dirএবং এমন জিনিসগুলির একটি সেট বাদ দিন যাতে আপনার প্রয়োজন হয় না:
    grep -r --exclude-dir /proc --exclude-dir /dev --exclude-dir /tmp --exclude-dir /lost+found

শেষ অবধি, কোনও বড় পুনরাবৃত্তিযোগ্য গ্রেপ করার সময় কয়েকটি 'অনুমতি-অস্বীকৃত' ত্রুটিগুলি অতিক্রম করা অস্বাভাবিক নয়। ব্যবহারের স্বাভাবিক কোর্সে এমন ফাইল রয়েছে যা আপনার ব্যবহারকারী পড়তে পারবেন না। যতক্ষণ না এগুলি কয়েকটি কয়েকটি অদ্ভুত ফাইল এবং আপনার হার্ড ড্রাইভ বা পুরো প্র্যাক ফাইল সিস্টেমের কাঁচা ডিভাইসের মতো জিনিস না থাকে ততক্ষণ ত্রুটিগুলি উপেক্ষা করা ঠিক হবে। বাস্তবে আপনি কমান্ড লাইনে এটি করতে পারেন সমস্ত ত্রুটি কখনও কখনও অবতরণ না করে প্রেরণ করে:

grep -r search_string /path 2> /dev/null

3
-Iবাইনারি বাদ দিতে
রাহুল পাতিল

2

সরলতার জন্য, আমি এসকে-গ্রেপ প্রস্তাব করব । লিঙ্কটি অনেকগুলি ক্ষেত্রে প্রদর্শিত হয় যখন ack-grepআরও ভাল বিকল্প হয়।

ব্যবহার করার জন্য, ইনস্টলের পরে:

ack-grep pattern /

এটি সুপারিশ করার জন্য ধন্যবাদ, তবে আমি এটি চালিয়েছি এবং এটি আমার প্রত্যাশিত অনুসন্ধান ফলাফলগুলি সত্যিই দেয় নি। দেখে মনে হচ্ছে আমার যা চাই তা পেতে আমাকে অনেক সেটিংস টুইট করতে হবে। রিচার্ডের উত্তর এখন ঠিক বাক্সের বাইরে চলেছে। ভবিষ্যতে এটিও ততক্ষণ দেখাবে যেমন এটি দরকারী হিসাবে কার্যকর হবে।
স্তর

1

এটি দেখার আরও একটি উপায় এইভাবে:

grep -r /* | grep "800x600"

0

* তারপরে আমি একটি / proc / sysrq- ট্রিগার পাই: ইনপুট / আউটপুট ত্রুটি

আপনার কমান্ড কাজ করছে আপনি এই ত্রুটিটি পাচ্ছেন কারণ আপনি স্ট্রিংয়ের জন্য চলমান প্রক্রিয়াগুলি স্ক্যান করার চেষ্টা করছেন।

আমি সিস্টেম ডিরেক্টরি বাদ দিয়ে সুপারিশ করছি

গ্রেপ-এক্সক্লুড-ডির = {প্রোকস, সিস} "800x600" /


-3

কেবল ডান-

grep -r "800x600" /

-আপনার বর্তমান কমান্ডে কী ভুল হয়েছে তা উদ্ধৃতি, ""। সর্বদা grepউদ্ধৃতিতে স্ট্রিং আর্গুমেন্ট রাখুন ।


3
এটি এখানে সমস্যা নয়। এই বিশেষ ধরণের যুক্তি দেওয়ার সময় আপনার উদ্ধৃতিগুলির প্রয়োজন হবে না grep। এটি চেষ্টা করুন এবং আপনি দেখতে পাবেন। "800x600" স্ট্রিংটি একটি ফাইলে রাখুন এবং তারপরে grep 800x600 fileআপনি দেখতে পাবেন এটি ঠিকঠাক কাজ করে। ওপিতে স্পষ্টতই অন্য কিছু সমস্যা রয়েছে।
slm
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.