গ্রেপ, তবে কেবলমাত্র কিছু ফাইল এক্সটেনশান


962

আমি grepকিছু ডিরেক্টরিতে কিছু স্ক্রিপ্ট লিখতে কাজ করছি , তবে এই ডিরেক্টরিগুলিতে সমস্ত ধরণের ফাইল টাইপ থাকে।

আমি grepকেবল .hএবং .cppএখনই চাই, তবে ভবিষ্যতে হয়ত আরও কয়েকজন।

এখন পর্যন্ত আমার কাছে রয়েছে:

{ grep -r -i CP_Image ~/path1/;

grep -r -i CP_Image ~/path2/;

grep -r -i CP_Image ~/path3/;

grep -r -i CP_Image ~/path4/;

grep -r -i CP_Image ~/path5/;} 

| mailx -s GREP email@domain.com

আমি কীভাবে এখন কেবলমাত্র নির্দিষ্ট ফাইলের এক্সটেনশানগুলি যুক্ত করব?


13
চেষ্টা করেছেন grep -r -i CP_Image ~/path1/*.{h,cpp}?

8
ব্যবহার করুন সিলভার অনুসন্ধানকারী : ag -i CP_Image ~/path[1-5] | mailx -s GREP email@domain.com। কাজ শেষ.
জনসিওয়েব


Egrep ব্যবহার করুন (সম্ভবত আপনার সিস্টেমে প্রাক ইনস্টলড) এবং তারপরে আপনি একটি রেজেক্স ব্যবহার করতে পারেন।
ডগওয়েদার

8
গনুহ বলছি সত্যিই বিশৃঙ্খলার সৃষ্টি যখন তারা যোগ -rকরার grepযে বিরতি যেমন ফাইল সরঞ্জামগুলি আমাদের কাছে "এক বিষয় না এবং এটি ভাল" থাকার ইউনিক্স মন্ত্রোচ্চারণের অনুসন্ধান আছে। খুব সুস্পষ্ট নামের সাথে ফাইলগুলি সন্ধানের জন্য একটি দুর্দান্ত উপায় রয়েছে।
এড মর্টন

উত্তর:


1347

--includeএই জাতীয় প্যারামিটারটি ব্যবহার করুন :

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP email@domain.com

আপনি যা চান তা করা উচিত

নীচে হোল্ডঅফহঙ্গারের উত্তর থেকে ব্যাখ্যাটি গ্রহণ করতে :

  • grep: কমান্ড

  • -r: পুনরাবৃত্তি

  • -i: অবহেলার ঘটনা

  • --include \*.cpp: সমস্ত * .সিপিপি: সি ++ ফাইল (ফাইলের নামগুলিতে অ্যাসিরিস্টস সহ আপনার ডিরেক্টরি রয়েছে কেবলমাত্র with দিয়ে পালানো)

  • ./: বর্তমান ডিরেক্টরি থেকে শুরু করুন।


123
রেকর্ডের জন্য: -r (পুনরাবৃত্তি) -i (উপেক্ষা-কেস) - অন্তর্ভুক্ত করুন (কেবলমাত্র ফাইলের সাথে মেলে এমন ফাইলগুলি অনুসন্ধান করুন)
লুইস

34
আরও অপ্টিমাইজ করা যায়grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345]
zwol

1
@Hong যেখানে ডকুমেন্টেশন রয়েছে যে -R প্রতীকী লিঙ্কগুলির জন্য?
শিরোনাম

8
এই উদাহরণটিতে কোনো উচ্চ স্কোর আছে বলে মনে হয় না কারণ এটি possibilites ধরনের বিস্তৃত কিন্তু উত্তর, grep -r --include = * টেক্সট 'SEARCHTERM' ./ সত্যিই উত্তর সারাংশ ব্যাখ্যা নিচে দেওয়া জুড়ে।
ডেভিড ক্যাসপার

10
ব্যাকস্ল্যাশের পরিবর্তে ডাবল কোট ব্যবহার করবেন না কেন? যেমন:grep -r -i --include="*.h" --include="*.cpp" CP_Image
পাম্বদা

283

এর মধ্যে কয়েকটি উত্তর খুব সিনট্যাক্স-ভারী বলে মনে হয়েছিল বা তারা আমার ডেবিয়ান সার্ভারে সমস্যা তৈরি করেছিল। এটি আমার জন্য পুরোপুরি কাজ করেন:

পিএইচপি বিপ্লব: লিনাক্সে ফাইলগুলি কীভাবে গ্রেপ করবেন, তবে কেবলমাত্র কিছু ফাইলের এক্সটেনশন?

যথা:

grep -r --include=\*.txt 'searchterm' ./

... বা কেস-সংবেদনশীল সংস্করণ ...

grep -r -i --include=\*.txt 'searchterm' ./
  • grep: কমান্ড

  • -r: পুনরাবৃত্তি

  • -i: অবহেলার ঘটনা

  • --include: সমস্ত *। টেক্সট: পাঠ্য ফাইল (ফাইলের নামগুলিতে অ্যাসিটার্কস সহ একটি ডিরেক্টরি থাকলে কেবলমাত্র with দিয়ে পালানো)

  • 'searchterm': কী সন্ধান করতে হবে

  • ./: বর্তমান ডিরেক্টরি থেকে শুরু করুন।


7
আপনি বা *ব্যবহার এড়ানো উচিত । অন্যথায় যখন ওয়ার্কিং ডিরেক্টরিতে কিছু ফাইল থাকে তখন এটি প্রত্যাশিত ফলাফল দেয় না । \*.cpp'*.cpp'*.txt
ম্লেবিয়াস

@ মেলিবিয়াস আপনি কীভাবে পালানোর প্রয়োজন তা ব্যাখ্যা করতে পারেন - সিপিপি বা টিএক্সটি এক্সটেনশানগুলির সাথে এটির কোনও সম্পর্ক আছে কি? অথবা আপনি কেবল উদাহরণ হিসাবে ব্যবহার করেছেন?
সাইমন ইস্ট

2
@ সিমোনইস্ট এই এক্সটেনশনগুলি হ'ল এই প্রশ্ন এবং উত্তরে ব্যবহৃত, অন্যথায় বিশেষ কিছু নয়। এটি সম্ভবত ব্যবহারের সময় অব্যাহতি ছাড়াই কাজ করবে --include=<pattern>তবে এটির *সাথে পালানো গুরুত্বপূর্ণ --include <pattern>(পরিবর্তে একটি স্থান =) যা অন্যথায় খুব অনুরূপ বলে মনে হয়।
ম্লেবিয়াস

52
grep -rnw "some thing to grep" --include=*.{module,inc,php,js,css,html,htm} ./

3
গ্রেপ -আরএন "গ্রেপ করার জন্য কিছু জিনিস" - অন্তর্ভুক্ত = *। {মডিউল, ইনক, সি, এইচ} *
আশীষ

3
চমৎকার উত্তর. আইএমও-তে স্বীকৃত চেয়ে ক্লিনার তবে আপনার অনুসন্ধানের মাপদণ্ডটি যোগ করা উচিত @ashish হিসাবে উল্লেখ করা হয়েছে
বিলিএনও

--includeঅন্য বিকল্পের সাথে নয় কেন সুইয়ের পরে বিকল্প?
ভ্লাদক্রাস

@ ভ্লাদক্রাস, আপনার সূচির অর্থ কী? এটা কি --?
এরপরে

50

কেমন:

find . -name '*.h' -o -name '*.cpp' -exec grep "CP_Image" {} \; -print

5
আমি এই -nameযুক্তিগুলি দলবদ্ধ করার পরামর্শ দেব । না করলে অদ্ভুত ঘটনা ঘটতে পারে। find . \( -name '*.h' -o -name '*.cpp' \) -exec grep "CP_Image" {} \; -print
নালারভলিউশন

কেবলমাত্র ফাইলগুলিতে আগ্রহী সমস্ত ডিরেক্টরি অবজেক্টকে উপেক্ষা করতে অতিরিক্ত "-type f" ব্যবহার করুন।
কেনসাই

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

@ বিউডেটের মন্তব্যে সম্বোধন করা, allyচ্ছিকভাবে findযুক্তিগুলি বান্ডিল করতে পারে, ডাকা প্রক্রিয়াটির ন্যূনতমতম হ্রাস করতে পারে। find . \( -name \*.h -o -name \*.cpp \) -exec grep -H CP_Image {} + এটি প্রস্তাবিত তবে নীচে @ ফেডরকিয়ার উত্তরে হাইলাইট করা হয়নি এবং এটি একটি সার্থক উন্নতি। -Hযখন এটি শুধুমাত্র একটি একক মেলা ফাইল চিহ্নিত যুক্তি এখানে grep দরকারী। এটি -printউত্তরের ব্যবহারকে দূর করতে পারে । যদি আপনার মোট ফাইলের তালিকা পর্যাপ্ত পরিমাণে ছোট হয় তবে একটি পুনরাবৃত্ত শেল গ্লোব (উদাহরণস্বরূপ {path1,path2}/**/*.{cpp,h}) ব্যবহার করা ভাল be
ম্যালকম

19

এইচপি এবং সান সার্ভারগুলিতে কোনও -r বিকল্প নেই, এইভাবে আমার এইচপি সার্ভারে আমার জন্য কাজ করেছে

find . -name "*.c" | xargs grep -i "my great text"

-i স্ট্রিংয়ের ক্ষেত্রে সংবেদনশীল অনুসন্ধানের জন্য


1
আমি ওয়েব হোস্টিং সংস্থাগুলির জন্য বেশ কয়েকটি সার্ভার জুড়ে এসেছি যেগুলিতে fgrep- এর জন্য অন্তর্ভুক্ত বিকল্প নেই এবং এটি হ'ল কমান্ড লাইন যা আমি those দৃষ্টান্তগুলিতে ব্যবহার করি।
বর্গবয়

উইন্ডোজ (MinGW / MSys) এর জন্য গিট ব্যবহার করার সময় - অন্তর্ভুক্ত বিকল্পটি পাওয়া যায় না is
ড্যারেন লুইস

উইন্ডোজের জন্য গিট বাশ-এ @ ড্যারেনলিউস উপলব্ধ। তবে আশ্চর্যের বিষয় হল এটি রঙিন এলিয়াস llযুক্ত করে তবে --color=autoগ্রেপগুলিতে যোগ করে না ।
Xeverous

এটি সম্পূর্ণতা, বহনযোগ্যতা এবং সংকোচনের জন্য স্বীকৃত উত্তর হওয়া উচিত!
গ্রান্ট ফস্টার

12

যেহেতু এটি ফাইলগুলি সন্ধানের বিষয় , আসুন আমরা ব্যবহার করি find!

গনুহ আপনি ব্যবহার করতে পারেন এটি ব্যবহার -regexবিকল্প ডিরেক্টরি বৃক্ষ যার এক্সটেনশন দিয়ে ঐ ফাইল খুঁজে পেতে পারেন .hবা .cpp:

find -type f -regex ".*\.\(h\|cpp\)"
#            ^^^^^^^^^^^^^^^^^^^^^^^

তারপরে, এটির grepপ্রতিটি ফলাফলের জন্য এটি কার্যকর করার বিষয় :

find -type f -regex ".*\.\(h\|cpp\)" -exec grep "your pattern" {} +

আপনার যদি এই বিতরণটি না পেয়ে থাকে তবে আপনাকে আমির আফগানির মতো একটি পন্থা ব্যবহার -oকরতে হবে , সাথে যুক্ত বিকল্পগুলি ব্যবহার করে ( নামটি হয় .hবা এর সাথে শেষ হয়.cpp ):

find -type f \( -name '*.h' -o -name '*.cpp' \) -exec grep "your pattern" {} +
#            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

এবং যদি আপনি সত্যিই ব্যবহার করতে চান grepতবে উল্লিখিত বাক্য গঠনটি অনুসরণ করুন --include:

grep "your pattern" -r --include=*.{cpp,h}
#                      ^^^^^^^^^^^^^^^^^^^

7

সবচেয়ে সহজ উপায়

find . -type  f -name '*.extension' | xargs grep -i string 

3

ag (সিলভার সন্ধানকারী) এর জন্য খুব সহজ বাক্য গঠন রয়েছে

       -G --file-search-regex PATTERN
          Only search files whose names match PATTERN.

সুতরাং

ag -G *.h -G *.cpp CP_Image <path>

: AG 2.2.0 ব্যবহার করে, আমি আমার পতাকা গত করা প্রয়োজনag _string_to_find_ -G _filename_regex_
ryanrain

3

নীচের উত্তরটি ভাল:

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP email@domain.com

তবে এতে আপডেট করা যেতে পারে:

grep -r -i --include \*.{h,cpp} CP_Image ~/path[12345] | mailx -s GREP email@domain.com

যা আরও সহজ হতে পারে।


1

প্রতিটি "-o-name" এর জন্য "-exec গ্রেপ" লিখতে হবে

find . -name '*.h' -exec grep -Hn "CP_Image" {} \; -o -name '*.cpp' -exec grep -Hn "CP_Image" {} \;

বা তাদের দ্বারা গ্রুপ করুন ()

find . \( -name '*.h' -o -name '*.cpp' \) -exec grep -Hn "CP_Image" {} \;

বিকল্প '-Hn' ফাইলের নাম এবং লাইন প্রদর্শন করে।


1

আমি জানি এই প্রশ্নটি কিছুটা তারিখযুক্ত তবে আমি সাধারণত .c এবং .h ফাইলগুলি খুঁজতে যে পদ্ধতিটি ব্যবহার করি তা ভাগ করতে চাই :

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -H "#include"

অথবা আপনার পাশাপাশি লাইন নম্বর প্রয়োজন হলে:

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -nH "#include"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.