উপ-ডিরেক্টরি সহ পাঠ্য সন্ধান করতে কীভাবে "গ্রেপ" কমান্ড ব্যবহার করবেন

আমি টেক্সট একটি নির্দিষ্ট স্ট্রিং থাকে যা সব ফাইল খুঁজে পেতে চান. দ্য grep কমান্ড কাজ করে, কিন্তু আমি (আমি শুধুমাত্র আমার বর্তমান ডিরেক্টরির জন্য এটা করতে পারেন) প্রতি ডিরেক্টরির জন্য এটি কিভাবে ব্যবহার করতে জানি না. আমি পড়ার চেষ্টা করেছি man grep, কিন্তু এটা কোন সাহায্য উত্পাদ করা হয়নি.

এটি ব্যবহার করা ভাল হবে

grep -rl "string" /path

কোথায়

  • -r (অথবা --recursive) বিকল্পটি সমস্ত উপ-ডিরেক্টরিগুলি অতিক্রম করতে ব্যবহৃত হয় /path যেখানে
  • -l (অথবা --files-with-matches) বিকল্পটি কেবল ম্যাচিং ফাইলগুলির ফাইলের নাম মুদ্রণ করতে ব্যবহৃত হয়, এবং ম্যাচিং লাইনগুলি নয় (এটি গতিও উন্নত করতে পারে, এটি দেওয়া হয়েছে grep এই বিকল্পের সাথে প্রথম ম্যাচে একটি ফাইল পড়া বন্ধ করুন).

আপনি ফাইল মিলে লাইন খুঁজছেন, আমার প্রিয় কমান্ড হল:

grep -Hrn 'search term' path/to/files
  • -H ফাইলের নাম প্রিন্ট করা কারণ (একাধিক ফাইল অনুসন্ধান করা হয় যখন উহ্য)
  • -r একটি পুনরাবৃত্ত অনুসন্ধান করে
  • -n লাইন নম্বরটি মুদ্রণ করার কারণ

path/to/files হতে পারে . বর্তমান ডিরেক্টরিতে অনুসন্ধান করতে

আরও বিকল্প যা আমি খুব দরকারী বলে মনে করি:

  • -I বাইনারি ফাইল উপেক্ষা করুন (পরিপূরক: -a সমস্ত ফাইলকে পাঠ্য হিসাবে বিবেচনা করুন)
  • -F আচরণ করা search term আক্ষরিক হিসাবে, নিয়মিত প্রকাশ নয়
  • -i কেস-সংবেদনশীল অনুসন্ধান করুন
  • --color=always বংশীধ্বনিতুল্য এমনকি যখন রং বলপূর্বক less. করতে less সমর্থন রং, আপনি ব্যবহার করতে হবে -r অপশন:

    grep -Hrn search . | less -r
  • --exclude-dir=dir ডিরেক্টরি বাদ দেওয়ার জন্য দরকারী .svn এবং .git.

Example output

আমি বিশ্বাস করি আপনি এই মত কিছু ব্যবহার করতে পারেন:

find /path -type f -exec grep -l "string" {} \;

মন্তব্য থেকে ব্যাখ্যা

find আপনি একটি নির্দিষ্ট পাথ সাব ডিরেক্টরি এবং লিঙ্ক মত ফাইল এবং অন্যান্য বস্তু খুঁজে দেয় যে একটি কমান্ড. আপনি যদি কোনও মাস্ক নির্দিষ্ট না করেন যা ফাইলসনামগুলি পূরণ করা উচিত, এটি সমস্ত ডিরেক্টরি গণনা করে বস্তু.

  • -type f নির্দিষ্ট করে যে এটি শুধুমাত্র ফাইল প্রক্রিয়া করা উচিত, ডিরেক্টরি ইত্যাদি নয়
  • -exec grep নির্দিষ্ট করে যে প্রতিটি পাওয়া ফাইলের জন্য, এটি গ্রেপ কমান্ডটি চালানো উচিত, এটির ফাইলের নামটিকে প্রতিস্থাপন করে যুক্তি হিসাবে প্রেরণ করা উচিত {} ফাইলের নাম সহ

আমার ডিফল্ট কমান্ড হল

grep -Rin string *

আমি একটি ক্যাপিটল ' আর ' ব্যবহার করি কারণ ls রিকার্সিভ জন্য এটি ব্যবহার করে. যেহেতু গ্রেপ উভয়ই গ্রহণ করে, এটি ব্যবহার না করার কোনও কারণ নেই

সম্পাদনা করুন: প্রতি এইচভিএনএসওয়েটিং, দৃশ্যত -R সিমলিঙ্কগুলি অনুসরণ করবে যেখানে -r হবে না.

আপনি যদি নতুন কিছু চেষ্টা করতে ইচ্ছুক হন তবে দিন ack একটি শট. কমান্ড পৌনঃপুনিকভাবে জন্য বর্তমান ডিরেক্টরি অনুসন্ধান string আইএস:

ack string

ইনস্টলেশন বেশ সহজ:

curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3

(যদি আপনি ইতিমধ্যে ডিরেক্টরি পেয়েছেন ~/bin এবং এটি আপনার মধ্যে পছন্দ করে PATH.)

কমান্ড আরগ্রেপ যেমন প্রয়োজন জন্য নিবেদিত হয়

যদি না পাওয়া যায় তবে আপনি এটি এটি পেতে পারেন

mkdir -p ~/bincd ~/binwget http://sdjf.esmartdesign.com/files/rgrepchmod +x rgrep

উপরে বর্ণিত হিসাবে আপনি সরাসরি আপনার ডিফল্ট গ্রেপ বিকল্পগুলিতে সেট করতে পারেন

আমি ব্যক্তিগত ব্যবহার

[[  ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"args="${args:--Hns} --color=auto"

সম্পর্কিত বিষয় : কীভাবে সর্বদা রঙের সাথে আরগ্রেপ ব্যবহার করবেন

আপডেট 2:

কমান্ড ব্যবহার করে এই লাইন find এবং grep সমস্যার সমাধান করে:

$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +

--color=<always or auto> রঙিন আউটপুট জন্য:

$ find path_to_search_in -type f \            -exec grep --color=always -in searchString {} 2>/dev/null +

উদাহরণ:

$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +

নীচের স্ন্যাপশটে চালানো একটি উদাহরণ:


আপডেট 1:

আপনি নিম্নলিখিত কোড চেষ্টা করতে পারেন; আপনার একটি ফাংশন হিসাবে .bashrc অথবা .bash_aliases অথবা একটি স্ক্রিপ্ট:

wherein () {     for i in $(find "$1" -type f 2> /dev/null);    do        if grep --color=auto -i "$2" "$i" 2> /dev/null; then            echo -e "\033[0;32mFound in: $i \033[0m\n";        fi;    done}

ব্যবহার: wherein /path/to/search/in/ searchkeyword

উদাহরণ:

$ wherein ~/Documents/ "hello world"

(দ্রষ্টব্য: @এনজোটিব দ্বারা নীচের মন্তব্যে প্রস্তাবিত হিসাবে, এটি তাদের নামের স্পেস সহ ফাইল/ডিরেক্টরিগুলির সাথে কাজ করে না)


মূল পোস্ট

অনুসন্ধান স্ট্রিং সঙ্গে স্ট্রিং এবং আউটপুট শুধু যে লাইন জন্য অনুসন্ধান:

$ for i in $(find /path/of/target/directory -type f); do \    grep -i "the string to look for" "$i"; done

যেমন:

$ for i in $(find /usr/share/applications -type f); \    do grep -i "web browser" "$i"; done

অনুসন্ধান স্ট্রিং ধারণকারী ফাইলের নাম প্রদর্শন করতে:

$ for i in $(find /path/of/target/directory -type f); do \    if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;

যেমন:

$ for i in $(find /usr/share/applications -type f); \    do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \    fi; done;

grep (গ্নু অথবা বিএসডি)

আপনি ব্যবহার করতে পারেন grep টুল পৌনঃপুনিকভাবে সঙ্গে বর্তমান ফোল্ডার অনুসন্ধান করতে -r প্যারামিটার, মত:

grep -r "pattern" .

নোট: -r - পৌনঃপুনিকভাবে সাব অনুসন্ধান.

নির্দিষ্ট ফাইলের মধ্যে অনুসন্ধান করতে, আপনি একটি ব্যবহার করতে পারেন গ্লোবিং সিনট্যাক্স যেমন:

grep "class foo" **/*.c

দ্রষ্টব্য: ব্যবহার করে গ্লোবিং বিকল্প (**), এটা নির্দিষ্ট এক্সটেনশন বা প্যাটার্ন সঙ্গে পৌনঃপুনিকভাবে সব ফাইল স্ক্যান করা হবে. এই সিনট্যাক্সটি সক্ষম করতে, চালান: shopt -s globstar. আপনি ব্যবহার করতে পারেন **/*.* (লুকানো এবং এক্সটেনশন ছাড়া ব্যতীত) সব ফাইল বা অন্য কোন প্যাটার্ন জন্য.

যদি আপনার যুক্তি খুব দীর্ঘ হয় এমন ত্রুটি থাকে তবে আপনার অনুসন্ধান সংকীর্ণ করার বিষয়টি বিবেচনা করুন বা ব্যবহার করুন find সিনট্যাক্স পরিবর্তে যেমন:

find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

বিকল্পভাবে ব্যবহার করুন ripgrep.

ripgrep

আপনি যদি বড় প্রকল্প বা বড় ফাইলগুলিতে কাজ করছেন তবে আপনার ব্যবহার করা উচিত ripgrep পরিবর্তে, মত:

rg "pattern" .

উপর ডক্স, ইনস্টলেশন পদক্ষেপ বা সোর্স কোড চেকআউট গিটহাব প্রকল্প পৃষ্ঠা.

এটা মত অন্য কোন টুল তুলনায় অনেক দ্রুত গ্নু/বিএসডি grep, ucg, ag, sift, ack, pt বা অনুরূপ, যেহেতু এটি উপরে নির্মিত হয় রাস্টের রেজেক্স ইঞ্জিন যা সসীম অটোমেটা ব্যবহার করে, সিমডি এবং আক্রমনাত্মক আক্ষরিক অপ্টিমাইজেশন খুব দ্রুত অনুসন্ধান করতে.

এটা নির্দিষ্ট নিদর্শন উপেক্ষা সমর্থন .gitignore ফাইল, তাই একটি একক ফাইল পাথ একযোগে একাধিক গ্লোব নিদর্শন বিরুদ্ধে মিলেছে করা যাবে.


আপনি যেমন সাধারণ পরামিতি ব্যবহার করতে পারেন:

  • -i - অসংবেদী অনুসন্ধান.
  • -I - বাইনারি ফাইল উপেক্ষা করুন.
  • -w - (আংশিক শব্দ ম্যাচিং বিপরীত) পুরো শব্দের জন্য অনুসন্ধান করুন.
  • -n - আপনার ম্যাচের লাইন দেখান.
  • -C/--context (যেমন -C5)- প্রসঙ্গ বৃদ্ধি, তাই আপনি পার্শ্ববর্তী কোড দেখতে .
  • --color=auto - মিলে টেক্সট চিহ্নিত করুন.
  • -H - টেক্সট পাওয়া যায় যেখানে ফাইলের নাম প্রদর্শন করে.
  • -c - প্রদর্শন মিলে লাইনের গণনা. সঙ্গে মিলিত হতে পারে -H.

আমি জারগ ব্যবহার করে এটি করি, একটি খুব আন্ডাররেটেড কমান্ড

find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'

খুঁজুন ./ আপনাকে একটি বর্তমান ফোল্ডারে সমস্ত ফাইলের একটি পুনরাবৃত্ত তালিকা দেয়তারপরে আপনি এটিকে জারগগুলিতে পাইপ করেন যা সেই ফাইলগুলির প্রত্যেকটিতে গ্রেপ কমান্ড কার্যকর করে

আমি জানি এখানে প্রচুর উত্তর রয়েছে, তবে ফাইলগুলি অনুসন্ধান করার সময় আপনি যদি অন্য বিধিনিষেধ যুক্ত করতে চান তবে এখানে একটি বিকল্প রয়েছে:

find . -type f -exec grep --quiet string_to_look_for {} ';' -print

এটি কাজ করে কারণ grep ফিরে আসবে 0 যদি এটি একটি ফলাফল পাওয়া যায়, 1 অন্যথায়. উদাহরণস্বরূপ আপনি 1 এমবি বড় ফাইলগুলি খুঁজে পেতে পারেন এবং কিছু ধারণ করে:

find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print

একাধিক প্রয়োজনীয়তার জন্য আপনি সম্ভবত অপ্টিমাইজার পতাকা ব্যবহার করতে চান -O এটি বিদ্যমান জিএনইউ গ্রেপ.

সঙ্গে ওয়াইল্ডকার্ড ’ – অন্তর্ভুক্ত="*.সি "’ বিকল্প, @ ইউজার 311346, ধন্যবাদ @ লেকেনস্টেইন.

  • সমস্ত টেক্সট ফাইলের মধ্যে নিচে বর্তমান ডিরেক্টরি থেকে অনুসন্ধান করবে .
    *মত ফাইল নিদর্শন পৌনঃপুনিকভাবে আমার অনুসন্ধান করতে কিভাবে নিশ্চিত না.সি কেবল গ্রেপ সহ

বর্তমান এবং সমস্ত সাব ডিরেক্টরিতে স্ট্রিংয়ের জন্য ফাইলগুলি পুনরাবৃত্তভাবে অনুসন্ধান করতে সন্ধান এবং গ্রেপ সংমিশ্রণটি ব্যবহার করুন এটি পরীক্ষা করুন http://wilddiary.com/find-files-containing-my-text/