কোনও ডিরেক্টরিতে পুনরাবৃত্তভাবে সমস্ত ফাইলগুলিতে গ্রেপ কীভাবে ব্যবহার করবেন?


34

আমি একটি ডিরেক্টরিতে সমস্ত ফাইলের টেক্সটের একটি স্ট্রিং অনুসন্ধান করতে চাই (এবং এর উপ-ডিরেক্টরিগুলি নয়; আমি জানি -rবিকল্পটি এটি করে, তবে এটি আমি চাই না)।

  1. চলমান

    grep "string" /path/to/dir
    

    এটি করতে সক্ষম হবার কথা, আমি পড়েছি, তবে এটি আমাকে ত্রুটি দেয়:

    grep: dir: একটি ডিরেক্টরি

  2. এরপরে, আমি grepএকাধিক ফাইল চালানোর চেষ্টা করেছি ।

    grep "string" .bashrc .bash_aliases পুরোপুরি কাজ করে।

    grep "string" .bash* উদ্দেশ্য হিসাবে কাজ করে।

    grep "string" * আমাকে ত্রুটি দেয়:

    grep: data: Is a directory
    grep: Desktop: Is a directory
    grep: Documents: Is a directory
    grep: Downloads: Is a directory
    ...
    

কেবল ত্রুটিগুলি মুদ্রিত হয়, আমি মিলে যাওয়া লাইনগুলি পাই না। আমি -sবিকল্পটি ব্যবহার করার চেষ্টা করেছি , তবে কোনও ফলসই হয়নি।

সুতরাং, আমার প্রশ্নগুলি:

  1. grep(1) হিসাবে, যখন আমি সক্ষম হব তখন কেন আমি কোনও ডিরেক্টরিতে ব্যবহার করতে পারছি না ? আমি ইন্টারনেটে প্রচুর উদাহরণে এটি দেখেছি।
    সম্পাদনা : যখন আমি "ডিরেক্টরিতে গ্রেপ ব্যবহার করে" বলি, তখন আমার অর্থ "ডিরেক্টরিটির সাব-ডিরেক্টরিগুলি বাদ দিয়ে সেই ডিরেক্টরিতে থাকা সমস্ত ফাইল অনুসন্ধান করুন"। আমি বিশ্বাস করি যে আপনি যখন কোনও ফাইলের পরিবর্তে ডিরেক্টরিতে এটি পাস করেন তখন গ্রেপ এটি করে। আমি কি ভুল?

  2. দয়া করে এর কার্যকারিতা সম্পর্কে আমাকে একটি ব্যাখ্যা দিন grep(2) এ আদেশগুলির আচরণের ব্যাখ্যা দেবে।
    সম্পাদনা : আমাকে আরও নির্দিষ্ট করা যাক। কেন ওয়াইল্ডকার্ডগুলি ব্যবহার করে একাধিক ফাইল সুনির্দিষ্ট .bash*করা *বা না করার জন্য অনুসন্ধানের জন্য নির্দিষ্ট করতে ব্যবহৃত হয় ./*?

  3. আমি কীভাবে কোনও ডিরেক্টরিতে (এবং এর উপ-ডিরেক্টরি নয়) সমস্ত ফাইল অনুসন্ধান করতে পারি grep?


এছাড়াও আপনি শেল প্রসারিত ওয়াইল্ডকার্ডের উপর নির্ভর করছেন *যেমন গ্লোব্বিং নামে পরিচিত। গ্লোব্বিংয়ের মধ্যে .bashrcস্ট্যান্ডার্ডের মতো ডট দিয়ে শুরু হওয়া ফাইলের নাম অন্তর্ভুক্ত থাকে না । আপনি শেল বিকল্পগুলি সেট করতে পারেন যাতে এটিতে এই ফাইলগুলি অন্তর্ভুক্ত থাকে তবে আপনি কী করছেন তা যদি আপনি না জানেন তবে আপনি নিজেকে কিছুটা গোলমেলে পেতে পারেন। গ্লোবিং বোঝার জন্য একটি ভাল গাইড এখানে পাওয়া যাবে mywiki.wooledge.org/glob
অ্যারোনিকাল

আমি কেন জানি, তবে আমি সর্বদা লুকানো ফাইলগুলিতে গ্লোববিং করেছি এবং এটি সর্বদা কার্যকর হয়েছে। আমি কোনও সেটিং বা কিছু পরিবর্তন করি নি। আমি যেমন উল্লেখ করেছি (2), এটিও কাজ grep "string" .bash*করে।
জন রেড

দুঃখিত, আমার শেষ উদাহরণটি ভুল ছিল। আপনি লুকানো ফাইলগুলিতেও অনুসন্ধান করতে পারেন এবং "ডিরেক্টরি এটি" দমন করতে পারেন কারণ লিনাক্স প্রযুক্তিগতভাবে ডিরেক্টরিগুলি বিভিন্ন ধরণের ফাইল হিসাবে দেখায়। আদেশটি তখন হবে: grep "string" * .* 2>/dev/nullবাgrep -s "string" * .*
টেরেন্স

উত্তর:


40

বাশ-এ, কোনও গ্লোব লুকানো ফাইলগুলিতে প্রসারিত হবে না, সুতরাং আপনি যদি কোনও ডিরেক্টরিতে সমস্ত ফাইল সন্ধান করতে চান তবে আপনাকে লুকানো ফাইলগুলি .*এবং গোপনীয়তা নির্দিষ্ট করতে হবে *

এড়াতে ত্রুটি, আপনি ব্যবহার করতে পারে "একটি ডিরেক্টরি লাগে না" -d skip, কিন্তু আমার সিস্টেমে আমিও কোনো ত্রুটির সম্মুখীন হয়েছেন grep: .gvfs: Permission denied তাই আমি ব্যবহার প্রস্তাব দিন -s, যা সব ত্রুটি বার্তা লুকিয়ে রাখে।

সুতরাং আপনি যে আদেশটি সন্ধান করছেন তা হ'ল:

grep -s "string" * .*

আপনি যদি অন্য দিরের মধ্যে ফাইলগুলি সন্ধান করছেন:

grep -s "string" /path/to/dir/{*,.*}

অন্য বিকল্পটি হ'ল dotglobশেল বিকল্পটি ব্যবহার করা , যা গোপনীয় ফাইলগুলিকে অন্তর্ভুক্ত করে include

shopt -s dotglob
grep -s "string" *

অন্য dir ফাইলের জন্য:

grep -s "string" /path/to/dir/*

† কেউ উল্লেখ করেছেন যে আমার এই ত্রুটিটি হওয়া উচিত নয়। এগুলি সঠিক হতে পারে - আমি কিছু পড়তে পেরেছি তবে এটির মাথা বা লেজ নিজেই তৈরি করতে পারলাম না।


এর মধ্যে *এবং জায়গার কোনও কারণ আছে .*?
হাশিম

2
@ হাশিম আপনার হোম ডিরেক্টরিতে আউটপুট তুলনা echo * .*এবং echo *.*চালনা করুন এবং পার্থক্যটি সুস্পষ্ট হওয়া উচিত। অন্যথায় এলএমকে এবং আমি এটি ব্যাখ্যা করব।
wjandrea

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

1
@ হাশিম আমি নিশ্চিত না যে আপনি কীভাবে এই সিদ্ধান্তে এসেছেন, সুতরাং আমাকে ব্যাখ্যা করুন। প্রথমত, ডিরেক্টরিগুলি এই প্রসঙ্গে ফাইলগুলি। গ্লোবগুলিতে, *সমস্ত অ গোপন ফাইল (যেমন ফাইলের নাম যা কোনও বিন্দু দিয়ে শুরু হয় না ) উপস্থাপন করে; .*সব লুকানো ফাইল প্রতিনিধিত্ব করে (অর্থাত ফাইলের নামের যে কি একটি বিন্দু দিয়ে শুরু); এবং *.*সমস্ত অ-লুকানো ফাইল যা প্রতিনিধিত্ব থাকতে একটি বিন্দু। ইন echo * .*, দুটি গ্লোব পৃথক পৃথক পৃথক পৃথক পৃথক পৃথক পৃথক পৃথক পৃথক পৃথক পৃথক পৃথক পৃথক পৃথক পৃথক পৃথক পৃথক পৃথক পৃথক পৃথক পৃথক পৃথক গ্লোবগুলি অবশ্যই: পৃথক পৃথক গ্লোব: একটি গোপনের জন্য নয়, একটি গোপনের জন্য। যদিও আমি আমার উত্তরে লিখেছি, আপনি শেল বিকল্পটি *চালু করে লুকানো ফাইলগুলি অন্তর্ভুক্ত করতে পারেন dotglob
wjandrea

1
*.*উইন্ডোজ (ডস) এ সমস্ত ফাইল তালিকাভুক্ত করার উপায় হিসাবে ব্যবহার করা সাধারণ তবে * নিক্সে কেবল একটি ডটযুক্ত ফাইলগুলিকে অন্তর্ভুক্ত করা হবে, সুতরাং এটি * নিক্সের কোনও অর্থ হয় না। পরিবর্তে আপনি *লুকানো ফাইলগুলি বাদে সমস্ত ফাইল তালিকাবদ্ধ করতে এবং .*লুকানো ফাইলগুলি তালিকার জন্য ব্যবহার করেন।
থোমাস্রুটার

10

আপনার -d skipবিকল্পটি যুক্ত করা দরকার।

  1. গ্রেপ ফাইলগুলির ভিতরে অনুসন্ধান করছে। আপনি যেমনটি বলেছিলেন, আপনি পুনরাবৃত্তভাবে অনুসন্ধান করতে পারেন, যদি আপনি কোনও ডিরেক্টরিতে ফাইল অনুসন্ধান করতে চান।

  2. ডিফল্টরূপে, গ্রেপ সমস্ত ফাইল পড়বে এবং এটি ডিরেক্টরিগুলি সনাক্ত করে। কারণ ডিফল্টরূপে আপনি -dবিকল্পের সাহায্যে ডিরেক্টরিগুলির সাথে কী করবেন তা সংজ্ঞায়িত করেননি , এটি ত্রুটি আউটপুট দেয়।

  3. কেবলমাত্র মূল ডিরেক্টরিতে সন্ধান করা হবে "স্ট্রিং"। /*


গ্রেপ সম্পর্কিত আরও তথ্যের জন্য দেখুন man grep
বেনামে 2

(ক) দয়া করে সম্পাদনাটি দেখুন। (খ) ব্যবহার করা কার্যকর -d skipহয় না; এটি মূলত একই -s; এছাড়াও, সম্পাদনা দেখুন। (গ) না, grep -d skip "string" ./*কোনটিই কাজ করে না।
জন রেড

7

পুরানো টাইমাররা সম্ভবত এটি করবে:

find . -type f -print0 | xargs -0 grep "string"

3
কেন হবে না find . -type f -exec grep string {} +?
wchargin

5
এছাড়াও আপনি চান -maxdepth 1
wchargin

@ ওয়াচারগিন: আপনি যদি কেবলমাত্র একটি ফাইল চান তবে আউটপুটে ফাইলের নামটি যদি আপনি চানfind . -type f -maxdepth 1 -exec grep string /dev/null {} +
গ্রেগরি নিসবেট

1
@ গ্রেগরিনিসবেট: গ্রেপ -Hথেকে পাস করুন।
wchargin

2

পুনঃব্যবস্থাপনা - আপনি সাবডিরেক্টরির এক স্তরে ফাইলগুলি গ্রেপ করতে চান, তবে সমস্ত উপ-সাব ডিরেক্টরিতে পুনরাবৃত্তি করবেন না?

grep forthis  *  */*

অথবা আপনি যদি বর্তমান ডিরেক্টরিটিতে ফাইলগুলি না চান

grep forthis  */*

নোট করুন এটি কোনও ডট দিয়ে শুরু ডিরেক্টরিগুলি খুঁজে পাবে না।

grep forthis  .*/*    */*   

যে কাজ করা উচিত।

এর রয়েছে -maxdepthএবং -mindepthসীমাবদ্ধতা উপলব্ধ পরামিতি findখুব কমান্ড।


grep forthis */*বর্তমান ডিরেক্টরি এবং একটি ডিরেক্টরি উভয়ই ফাইল অনুসন্ধান করবে না ?
হাশিম

@ হাশিম বেশিরভাগ ক্ষেত্রেই না - */*কেবলমাত্র একটি স্ল্যাশের সাথে জিনিসগুলি মেলে। আপনার যদি a/bবর্তমান ডিরেক্টরিতে কোনও ফাইলের নাম থাকে তবে `* / * এর সাথে এটি মিলবে।
ক্রিগগি

0

সমস্ত ত্রুটি এড়ানো ছাড়াই ডিরেক্টরিগুলি এড়িয়ে যাওয়ার উদাহরণ এখানে রয়েছে:

grep --directories='skip' 'searchString' *
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.