আমি শত শত পিএইচপি ফাইল সহ কোনও সাইটে ক্লাস ঘোষণার জন্য অনুসন্ধান করছি। আমি কিভাবে ব্যবহার বর্তমান ফোল্ডার এবং সাবফোল্ডার এটি করতে পারেন , grep ?
আমি cd
ফোল্ডারে আইএনজি পরীক্ষা করেছি এবং তারপরে এরকম কিছু
grep -r 'class MyClass' *.php
আমি শত শত পিএইচপি ফাইল সহ কোনও সাইটে ক্লাস ঘোষণার জন্য অনুসন্ধান করছি। আমি কিভাবে ব্যবহার বর্তমান ফোল্ডার এবং সাবফোল্ডার এটি করতে পারেন , grep ?
আমি cd
ফোল্ডারে আইএনজি পরীক্ষা করেছি এবং তারপরে এরকম কিছু
grep -r 'class MyClass' *.php
উত্তর:
আপনি চেষ্টা করতে পারেন
grep -r --include=*.php "search string" /path/to/dir
আমি আপনাকে সুপারিশ করব যে আপনি গ্রিপ দিয়ে না করে ctags এর মতো কিছু ব্যবহার করুন । তবে আপনি চাইলে আপনিও এর মতো কিছু করতে পারেন
find <top level dir> -name \*.php | xargs grep "class MyClass"
এটি অবশ্যই ধরে নিয়েছে যে আপনার মধ্যে কেবল একটি একক স্থান রয়েছে class
এবং myClass
যা সত্য হতে পারে না। যদিও যে কোনও শ্বেত স্পেসের জন্য সন্ধানের জন্য রিজেপেক্সটি পরিবর্তন করা সহজ।
আপনি যদি ব্যবহার করেন তবে -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 ডিরেক্টরিগুলি নির্দিষ্ট ডিরেক্টরি বাদ দিতে হবে তা প্রদর্শন করে।
চিরসবুজ অ্যাক্কি ব্যবহার করে ,
ack --php 'class MyClass'
grep -r 'class MyClass' *.php
.php সহ শেষ হওয়া নামগুলির সাথে সমস্ত ফোল্ডার সন্ধান করবে
grep -r 'class MyClass' . | grep .php
সমস্ত উপ ফোল্ডারগুলিতে সমস্ত ফাইলগুলিতে ক্লাস মাইক্লাস অনুসন্ধান করবে, তারপরে কেবল তাদের মধ্যে। php রয়েছে return
find . -type f -name *.php -print -exec grep \"class MyClass\" {} \;
লাইনটি খুঁজে পাওয়া যায়নি এবং ফাইলটির পথের লিখিত সামগ্রী আপনাকে দেবে।
সম্ভবত আপনি কেস সংবেদনশীলতা এবং হোয়াইটস্পেস সহনশীলতা চান এবং বর্তমান ডিরেক্টরিটিতে পছন্দসই ফাইল প্যাটার্নের কোনও উদাহরণ না পেলে গ্রেপ বন্ধ হয়ে যাবে। এটি কোথায় যেমন শুরু হবে তা জানা দরকার এবং কোনও ফাইলের মিল নেই কোনও প্রারম্ভিক পথ তৈরি করে না।
যদি পছন্দসই এক্সটেনশনের কমপক্ষে একটি ফাইল থাকে তবে আপনি 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
আমি জানি এটি ব্যবহার করে বলে grep
, তবে আমার ব্যক্তিগত পছন্দটি হ'ল ack-grep
:
ack-grep "class MyClass"
এটি পুনরাবৃত্তভাবে চলমান, ফাইলের নাম তালিকাভুক্ত করে যেখানে ফলাফলটি পাওয়া যায় যেখানে লাইন নম্বর পাওয়া যায় সেগুলির জন্য এবং হাইলাইটগুলি। বিশেষত পিএইচপি ফাইলগুলিকে লক্ষ্য করতে আপনি চালাতে পারেন:
ack-grep --type-set php:ext:php "path"
প্যাকেজের বিকল্পগুলির আধিক্য রয়েছে; অভিনব কাজ করার জন্য আমি অবশ্যই এটির (এবং এর সাথে সম্পর্কিত ম্যান পৃষ্ঠাটি ব্রাউজ করা) সুপারিশ করব।
grep -r
দেয়নি সে সম্পর্কে আপনি কিছু বলতে চাইবেন ।