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


40

আমি যখন বর্তমান ডিরেক্টরিটিতে একটি পুনরাবৃত্ত গ্রেপ অনুসন্ধান করতে চাই, আমি সাধারণত:

grep -ir "string" .

কিন্তু সেই কমান্ডটি বাইনারি ফাইলগুলি (ছবি, অডিও, ভিডিও, ইত্যাদি ...) সহ সকল ধরণের ফাইলের ভিতরে অনুসন্ধান করে যার ফলশ্রুতি খুব ধীর অনুসন্ধানের প্রক্রিয়াতে আসে।

উদাহরণস্বরূপ, আমি যদি এটি করি তবে এটি কাজ করে না:

grep -ir "string" *.php

এটি কাজ করে না কারণ বর্তমান ডিরেক্টরিতে কোনও পিএইচপি ফাইল নেই, তবে বর্তমান ডিরেক্টরিতে কিছু সাব-ডাইরেক্টরির ভিতরে রয়েছে, এবং উপ-ডিরেক্টরিগুলির নাম "। Php" দিয়ে শেষ হয় না তাই গ্রেপ তাদের অভ্যন্তরে না দেখায়।

সুতরাং, আমি কীভাবে বর্তমান ডিরেক্টরি থেকে পুনরাবৃত্ত অনুসন্ধান করতে পারি তবে ফাইলের নাম ওয়াইল্ডকার্ডও নির্দিষ্ট করতে পারি? (যেমন: কেবলমাত্র একটি নির্দিষ্ট এক্সটেনশনে শেষ হওয়া ফাইলগুলিতে অনুসন্ধান করুন)

উত্তর:


58

grepএর --includeবিকল্পটি ব্যবহার করুন :

grep -ir "string" --include="*.php" .

1
ঠিক আছে, মনে হচ্ছে গ্রীপের আমার সংস্করণটি পুরানো ছিল, কারণ এটির বিকল্প নেই (কেন আমি কীভাবে এটি করতে পারি তা বুঝতে পারছি না!)। আমি বার্তাটি পেয়েছি: "গ্রেপ: অপরিজ্ঞাত বিকল্প` - অন্তর্ভুক্ত = *। পিএইচপি '"। তবে আমি সবেমাত্র একটি নতুনতে আপগ্রেড করেছি এবং এখন এটি কার্যকর হয়। ধন্যবাদ!
ওএমএ

আমাকে grep -ir "string" --include="*.php" *
স্টুয়ার্ট

ভেবেছিলাম পিরিয়ডটা ঠিক লাইনের শেষ! আমি ব্যবহার বা প্রয়োজন ছিল না।
বোর্ডটসি

14

যদি এর কোনও সংস্করণে বিকল্পের grepঅভাব থাকে তবে --includeআপনি নিম্নলিখিতটি ব্যবহার করতে পারেন। এগুলি উভয়ই এই জাতীয় ডিরেক্টরি কাঠামোতে পরীক্ষা করা হয়েছিল:

$ tree
.
├── a
├── b
   └── foo2.php
├── c
   └── d
       └── e
           └── f
               └── g
                   └── h
                       └── foo.php
├── foo1.php
└── foo.php

যেখানে সমস্ত .phpফাইলের স্ট্রিং থাকে string

  1. ব্যবহার find

    $ find . -name '*php' -exec grep -H string {} +
    ./b/foo2.php:string
    ./foo1.php:string
    ./c/d/e/f/g/h/foo.php:string

    ব্যাখ্যা

    এটি সমস্ত .phpফাইল সন্ধান করবে এবং তারপরে grep -H stringতাদের প্রতিটিটিতে চালিত হবে। সঙ্গে find'র -execবিকল্প, {}ফাইল পাওয়া যায়নি প্রতিটি দ্বারা প্রতিস্থাপিত হয়। -Hবলে grepফাইলের নাম এবং সেইসাথে মিলেছে লাইন প্রিন্ট করতে।

  2. ধরে নেওয়া যাক আপনি একটি নতুন যথেষ্ট সংস্করণ আছে bash, ব্যবহার globstar:

    $ shopt -s globstar
    $ grep -H string  **/*php
    b/foo2.php:string
    c/d/e/f/g/h/foo.php:string
    foo1.php:string

    ব্যাখ্যা

    ব্যাশ ম্যানুয়ালটিতে যেমন ব্যাখ্যা করা হয়েছে :

    globstar

    যদি সেট করা থাকে তবে ফাইল নাম সম্প্রসারণ প্রসঙ্গে ব্যবহৃত প্যাটার্ন '**' সমস্ত ফাইল এবং শূন্য বা আরও বেশি ডিরেক্টরি এবং সাব ডিরেক্টরিতে মেলে। যদি প্যাটার্নটি '/' দ্বারা অনুসরণ করা হয় তবে কেবল ডিরেক্টরি এবং উপ-ডিরেক্টরিগুলি মিলবে।

    সুতরাং, চালিয়ে shopt -s globstarআপনি বৈশিষ্ট্যটি সক্রিয় করছেন এবং বাশের globstarবিকল্পটি যা বর্তমান ডিরেক্টরিতে **/*phpসমস্ত .phpফাইলগুলিতে প্রসারিত করে ( **0 বা ততোধিক ডিরেক্টরিগুলির সাথে **/*phpমেলে , তাই ম্যাচগুলিও ./foo.phpহয়) যার জন্য গ্রেপ করা হয় string


-2

ব্যবহার */*.php

এটি গ্রেপ অনুসন্ধানকে উপ-ডিরেক্টরিতে এক স্তরের করে তোলে


তারকাচিহ্ন এবং বিন্দু অদৃশ্য হওয়ার সাথে সাথে কিছু ভুল হয়েছে।
ডেনিস নোলান

আপনি কোডটি ফর্ম্যাট করতে ব্যাকটিক্স ব্যবহার করতে পারেন এবং মার্কডাউন ফর্ম্যাটিংয়ে জোর দেওয়ার জন্য অ্যাসিরিস্কের ব্যবহার সম্পর্কে অস্পষ্টতা এড়াতে পারেন। পিএস নোট করুন প্রশ্নটি চূড়ান্ত অনুচ্ছেদে "পুনরাবৃত্ত অনুসন্ধান" সম্পর্কে জিজ্ঞাসা করেছে (যদিও আমার ডাউনভোটটি নয়)।
রেডগ্রিটিব্রিক 9

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