আমি কীভাবে `গ্রেপা ব্যবহার করে কোনও পিএইচপি ফাইলে স্ট্রিং সন্ধান করব?


11

আমি শত শত পিএইচপি ফাইল সহ কোনও সাইটে ক্লাস ঘোষণার জন্য অনুসন্ধান করছি। আমি কিভাবে ব্যবহার বর্তমান ফোল্ডার এবং সাবফোল্ডার এটি করতে পারেন , grep ?

আমি cdফোল্ডারে আইএনজি পরীক্ষা করেছি এবং তারপরে এরকম কিছু

grep -r 'class MyClass' *.php

এটি যখন সুপারইউজারে স্থানান্তরিত হয়, আপনি যা চাননি যা আপনাকে grep -rদেয়নি সে সম্পর্কে আপনি কিছু বলতে চাইবেন ।

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

@ অন্যান্য মন্তব্য: তার গ্রেপ-র বিবৃতি তিনি যা চান তা দিচ্ছে না, যদি না সমস্ত ফোল্ডার .php দিয়ে শেষ হয় যা সম্ভবত ঘটনা নয় ...
ডেভিড ওনিল

আমি কিছু পাইনি। আমি ধরে নিয়েছি এটি কার্যকর হয়নি কারণ আমি জানি যে এটি যখন এই ফোল্ডারে এই শ্রেণীর সাথে ফাইল রয়েছে তখন এটি সন্ধান করে

আমি ভাগ্যক্রমে ফাইলটি খুঁজে পেয়েছি। যে ফোল্ডারে সেই লাইনের সাথে পিএইচপি ফাইল রয়েছে সেই ফাইলটি অনুসন্ধান করার সময় এটি এটি খুঁজে পায় (-r এর প্রয়োজন নেই)। আমি যদি রুটে সিডি করি এবং পুনরাবৃত্তি দিয়ে অনুসন্ধান করি - তবে এটি কিছুই দেয় না।

উত্তর:


24

আপনি চেষ্টা করতে পারেন

grep -r --include=*.php "search string" /path/to/dir

1
দুর্দান্ত কাজ করে। আমি ভুলে যেতে থাকি, তবে ভাগ্যক্রমে আমাকে উত্তর দেওয়ার জন্য এই উত্তরটি সবসময় আছে। :)
গোলেজট্রোল

এটি জানতে পেরে @ গোলেজট্রোল আনন্দিত :-)
rahul286

9

আমি আপনাকে সুপারিশ করব যে আপনি গ্রিপ দিয়ে না করে ctags এর মতো কিছু ব্যবহার করুন । তবে আপনি চাইলে আপনিও এর মতো কিছু করতে পারেন

 find <top level dir> -name \*.php | xargs grep "class MyClass"

এটি অবশ্যই ধরে নিয়েছে যে আপনার মধ্যে কেবল একটি একক স্থান রয়েছে classএবং myClassযা সত্য হতে পারে না। যদিও যে কোনও শ্বেত স্পেসের জন্য সন্ধানের জন্য রিজেপেক্সটি পরিবর্তন করা সহজ।


4

আপনি যদি ব্যবহার করেন তবে -rআপনি সম্ভবত কেবল বর্তমান ডিরেক্টরিটি পুনরাবৃত্তভাবে অনুসন্ধান করতে চান :

grep -r 'class MyClass' .

উপরের সময়টির সময়টি নোট করুন।

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

গ্রেপের বেশিরভাগ অবতারে অনুসন্ধান করা যেতে পারে এমন ফাইল এক্সটেনশনগুলি নির্দিষ্ট করার কোনও উপায় নেই, সুতরাং আপনি সাধারণত এটির সাথে মিল রেখে অনুসন্ধানটি ব্যবহার করেন:

find <startDir> -iname '*.php' -exec grep 'class[ \t]*MyClass' {} \;

-inameগ্রেপের কিছু সংস্করণ জানায় যে আপনি কেস-সংবেদনশীল ফাইলের নাম অনুসন্ধান করতে চান, তবে জিএনইউ-এর অননুমোদিত রূপগুলির অনেকগুলি এটি সমর্থন করে না, আপনি -nameপরিবর্তে ব্যবহার করতে পারেন ।

-execবিকল্প উপরে প্রতিটি ফাইল, যা মোটামুটি ব্যয়বহুল জন্য grep invoking পাশ প্রভাব রয়েছে।

গ্রিপ-এর এখনও অন্য সংস্করণগুলি কার্যকর +করে যাবার আহ্বানের সংখ্যা হ্রাস করার জন্য একসাথে যুক্তি যুক্ত করার জন্য বলে:

find <startDir> -iname '*.php' -exec grep 'class[ \t]*MyClass' {} + \;

অনুরোধগুলি হ্রাস করার একটি ঘন ঘন প্রস্তাবিত উপায় হ'ল xargs ব্যবহার করা যা গ্রেপটিকে যতবার সম্ভব সম্ভব হয় ততবার বার প্রয়োজন হবে তবে যতবার সম্ভব প্রয়োজন হবে:

find <startDir> -iname \*.php | xargs grep "class[ \t]*MyClass"

xargsকমান্ড লাইনে সমর্থিত সর্বোচ্চ সংখ্যক আর্গুমেন্ট পর্যন্ত গ্রেপ পাস করার জন্য যথেষ্ট স্মার্ট, তবে উপরোক্ত প্রকরণটি স্পেসের মতো নির্দিষ্ট অক্ষরগুলিকে খুব ভালভাবে পরিচালনা করে না। উদাহরণস্বরূপ, 'file.php' ফাইল ফাইলের একটি গ্রেপ আর্গুমেন্ট হিসাবে '' 'এবং আর্গুমেন্ট হিসাবে' file.php 'গ্রহণ করত যাতে উভয়ই খুঁজে পাওয়া যায় না। পরিবর্তে আমরা ব্যবহার:

find <startDir> -iname \*.php -print0 | xargs -0 grep "class[ \t]*MyClass"

print0এবং -0একসাথে কাজ করুন এবং নাল চরিত্রের পরে যুক্তিগুলি ব্যবহার করুন যাতে যুক্তিটি সম্পূর্ণ এবং দ্ব্যর্থহীনভাবে চিহ্নিত করা যায়।

চ এর পরে আপনার একাধিক স্পেস classবা একটি ট্যাব থাকতে পারে, আপনি রেজেক্স পরিবর্তন করে আরও অক্ষরকে অনুমতি দিতে চাইতে পারেন:class[ \t]*MyClass

স্ট্যাকওভারফ্লোতে এই পোস্টে অন্যান্য উদাহরণ রয়েছে এবং কীভাবে .svn ডিরেক্টরিগুলি নির্দিষ্ট ডিরেক্টরি বাদ দিতে হবে তা প্রদর্শন করে।


এটি সমস্ত ফাইল অনুসন্ধান করে। ফাইল .php ফাইল নয়।
গোলেজট্রোল 18

অন্যান্য অনেক উদাহরণ অন্তর্ভুক্ত করার জন্য আমি পোস্টটি আপডেট করেছি।
কালেব পেডারসন


1
grep -r 'class MyClass' *.php

.php সহ শেষ হওয়া নামগুলির সাথে সমস্ত ফোল্ডার সন্ধান করবে

grep -r 'class MyClass' . | grep .php

সমস্ত উপ ফোল্ডারগুলিতে সমস্ত ফাইলগুলিতে ক্লাস মাইক্লাস অনুসন্ধান করবে, তারপরে কেবল তাদের মধ্যে। php রয়েছে return


1

find . -type f -name *.php -print -exec grep \"class MyClass\" {} \; লাইনটি খুঁজে পাওয়া যায়নি এবং ফাইলটির পথের লিখিত সামগ্রী আপনাকে দেবে।


1

ম্যাচ করা ফাইলগুলির ক্ষেত্রে নির্বিচারে নাম থাকতে পারে, আপনার ব্যবহারটি বিবেচনা করা উচিত -print0

অনুসন্ধান . -type f -name '* .php' -প্রিন্ট0 | xargs -0 গ্রেপ 'ক্লাস মাই ক্লাস'


1
grep -rl 'class MyClass' . --include \*.php

l শুধুমাত্র ফাইলের নাম দেখায়

r recurive হয়

। বর্তমান ফোল্ডারে অনুসন্ধান করে

- ফাইলের নাম এক্সটেনশন সীমাবদ্ধ করুন


1

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

যদি পছন্দসই এক্সটেনশনের কমপক্ষে একটি ফাইল থাকে তবে আপনি egrep -ir ব্যবহার করতে পারেন। findএবং xargsতাদের ক্ষমতাটি একক ফ্ল্যাট (তবে খুব বড়) ডিরেক্টরিগুলির সাথে দেখান যা গ্রেপ ব্যর্থ হয় এবং অতিরিক্ত বাছাইকারীদের (উদাহরণস্বরূপ যদি আপনি কেবলমাত্র .inc, .php এবং php2 ফাইল অনুসন্ধান করতে চান)। তবে এটি আমার অভিজ্ঞতায় বেশ কিছুটা সুবিধা এবং গতি হারাতে বসেছে। মানব লিখিত শ্রেণীর ঘোষণার জন্য একটি বড় সমস্যা হোয়াইটস্পেস হতে চলেছে। সুতরাং গ্রেপের পরিবর্তে egrep ব্যবহার করুন। অতিরিক্ত গতির জন্য এছাড়াও এলসি_এলএল = সি। সুবিধার জন্য, আমি প্রায়শই ব্যবহার করি:

LC_ALL=C egrep -irn "class[ ]*myclass([ ]|\n)" * | egrep "\.(inc|php[35]?)"

-i -- case insensitive
-r -- recursive for all file pattern (here *)
-n -- include the line number
LC_ALL=C -- search in ASCII, not in utf8, this is much faster.

[ ]* -- match any number of spaces before the class name
([ ]|\n) -- match a space or newline after the classname

এটি এখনও মতামতগুলির সাথে মেলে, যেমন // class myclass exists in file, তবে আমি সেগুলি তুলনামূলকভাবে ছোট বলে মনে করি এবং সেগুলি দিয়ে ফিল্টার করা যায়... | fgrep -v '//'

আপনি আরও জটিল ফাইল মাস্ক অন্তর্ভুক্ত করতে পারেন (উদাহরণস্বরূপ, সর্বাধিক .inc এবং .php ফাইলগুলি ধরার জন্য) যেমন egrep ফাইলের ধরণটিতে:

egrep "pattern" *.[ip]*

এটি (প্রথম বিকল্পগুলির সাথে) বেশ দ্রুত এবং বেশিরভাগ পিএইচপি ফাইলগুলিতে সীমাবদ্ধ থাকবে।

আছে HTH


0

আমি জানি এটি ব্যবহার করে বলে grep, তবে আমার ব্যক্তিগত পছন্দটি হ'ল ack-grep:

ack-grep "class MyClass"

এটি পুনরাবৃত্তভাবে চলমান, ফাইলের নাম তালিকাভুক্ত করে যেখানে ফলাফলটি পাওয়া যায় যেখানে লাইন নম্বর পাওয়া যায় সেগুলির জন্য এবং হাইলাইটগুলি। বিশেষত পিএইচপি ফাইলগুলিকে লক্ষ্য করতে আপনি চালাতে পারেন:

ack-grep --type-set php:ext:php "path"

প্যাকেজের বিকল্পগুলির আধিক্য রয়েছে; অভিনব কাজ করার জন্য আমি অবশ্যই এটির (এবং এর সাথে সম্পর্কিত ম্যান পৃষ্ঠাটি ব্রাউজ করা) সুপারিশ করব।

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