আমি একাধিক ফাইলের জন্য গ্রেপ - অন্তর্ভুক্ত বিকল্পটি কীভাবে ব্যবহার করব?


100

যখন আমি কোনও ডিরেক্টরিতে সমস্ত এইচটিএমএল ফাইলগুলি গ্রেপ করতে চাই, আমি নিম্নলিখিতটি করি

grep --include="*.html" pattern -R /some/path

যা ভাল কাজ করে। সমস্যাটি কীভাবে কোনও ডিরেক্টরিতে সমস্ত এইচটিএমএল, এইচটিএম, পিএইচপি ফাইলগুলি গ্রেপ করবেন?

এই ব্যবহার থেকে গ্রেপ - এক্সক্লুড / - নির্দিষ্ট ফাইলের মাধ্যমে গ্রেপ না করার সিনট্যাক্স অন্তর্ভুক্ত করুন , মনে হয় যে আমি নিম্নলিখিতগুলি করতে পারি

grep --include="*.{html,php,htm}" pattern -R /some/path

তবে দুঃখের বিষয়, এটি আমার পক্ষে কাজ করবে না।
এফওয়াইআই, আমার গ্রেপ সংস্করণটি 2.5.1।

উত্তর:


143

আপনি একাধিক --includeপতাকা ব্যবহার করতে পারেন । এটি আমার পক্ষে কাজ করে:

grep -r --include=*.html --include=*.php --include=*.htm "pattern" /some/path/

তবে, আপনি Deruijterপরামর্শ হিসাবে করতে পারেন । এটি আমার পক্ষে কাজ করে:

grep -r --include=*.{html,php,htm} "pattern" /some/path/

ভুলে যাবেন না যে আপনি findএবং xargsএই ধরণের জিনিসটির জন্য ব্যবহার করতে পারেন :

find /some/path/ -name "*.htm*" -or -name "*.php" | xargs grep "pattern"

এইচটিএইচ


4
আমি সমস্যা দেখতে পাচ্ছি। আমি শেলকে প্রসারিত হতে আটকাতে ---- অন্তর্ভুক্ত = " ।} এইচটিএমএল, পিএইচপি}" ব্যবহার করেছি যা একই সময়ে শেলটি {এইচটিএমএল, পিএইচপি expand প্রসারিত করতে থামায়} দেখে মনে হচ্ছে যে সমান সাইন ইন - অন্তর্ভুক্ত = * শেলটি '*' প্রসারিত থেকে রোধ করতে সক্ষম।
tianyapiaozi

xargs আসলেই বিকল্প নয়; আপনার যখন এই বৈশিষ্ট্যটির প্রয়োজন হয় তখন আপনি xargs যত বেশি হ্যান্ডেল করবেন তার চেয়ে বেশি ফাইল নিয়ে কাজ করছেন।
জেমস মুর

4
@ জামেসমুর: জিএনইউ সমান্তরালে একবার দেখুন । এটি প্রায়শই বিকল্প হিসাবে ব্যবহার করা যেতে পারে xargsএটি দ্রুত পড়ার পক্ষে মূল্যবানও। এইচটিএইচ।
স্টিভ

4
@ ইয়ানিয়াপিয়াওজি: আপনি ঠিক বলেছেন যে ব্রেস প্রসারণের চারপাশে উদ্ধৃতি দেওয়া সমস্যা; ছাড়া উদ্ধৃতি অবশ্য *এখনও globbing সাপেক্ষে টোকেন এটা এমবেড করা হয় অংশ হিসেবে , এটা ঠিক এরকম না এই ক্ষেত্রে ম্যাচে কিছু, কারণ শুধুমাত্র ফাইল আক্ষরিক ভালো কিছু নামে --include=foo.htmlমেলে যাবে। নিরাপদ থাকতে, *(যা দিয়ে আপনি স্বতন্ত্রভাবে করতে পারেন \*) উদ্ধৃত করুন । একটি অতিরিক্ত বোনাস হিসাবে এটি এটি চাক্ষুষরূপে পরিষ্কার করে দেয় যে শেলটি এই ক্ষেত্রে গ্লোববিং করা উচিত নয়
mklement0

4
findসমাধান হিসাবে : এর -exec grep "pattern" {} +পরিবর্তে ব্যবহার | xargs grep "pattern"করা আরও শক্তিশালী (উদাহরণস্বরূপ স্পেসগুলির সাথে ফাইলের নামগুলি পরিচালনা করে) পাশাপাশি আরও দক্ষ।
mklement0

32

ব্যবহার {html,php,htm}শুধুমাত্র একটি যেমন কাজ করতে পারেন বক্রবন্ধনী সম্প্রসারণ , যা একটি নন-স্ট্যান্ডার্ড (না POSIX-অনুবর্তী) এর বৈশিষ্ট্য bash, kshএবং zsh

  • অন্য কথায়: এটি কোনও স্ক্রিপ্টে লক্ষ্য করে লক্ষ্য করে ব্যবহার করার চেষ্টা করবেন না /bin/sh- সেক্ষেত্রে সুস্পষ্ট একাধিক --includeযুক্তি ব্যবহার করুন ।

  • grepনিজেই স্বীকৃতি বুঝতে পারে না{...}

একটি ধনুর্বন্ধনী প্রসারকে স্বীকৃতি দেওয়ার জন্য, এটি অবশ্যই কমান্ড লাইনের একটি অব্যক্ত (ক এর অংশ) টোকেন হতে হবে।

একটি ধনুর্বন্ধনী প্রসার একাধিক যুক্তিতে প্রসারিত হয় , সুতরাং ক্ষেত্রে একাধিক বিকল্প grepদেখে শেষ হয় ঠিক যেমন আপনি পৃথকভাবে সেগুলি পাস করেছেন। --include=...

একটি বক্রবন্ধনী সম্প্রসারণের ফলাফল নেই globbing (ফাইলের নাম সম্প্রসারণ) সাপেক্ষে , যা হয়েছে ফাঁদ :

  • প্রতিটি ফলাফল যুক্তির সাথে মিলিয়ে ফাইলের নামগুলিতে আরও প্রসারিত করা যেতে পারে যদি এরকম উদ্বৃত্ত গ্লোব্বিং মেটাচার্যাক্ট যেমন থাকে *
    এই যেমন টোকেন সঙ্গে অসম্ভাব্য --include=*.html(যেমন, আপনি একটি ফাইল আছে চাই আক্ষরিক নামে ভালো কিছু --include=foo.htmlম্যাচ কিছু জন্য), এটা সাধারণভাবে মনে মূল্য পালন করা হয়।

  • যদি nullglobশেল বিকল্পটি ( shopt -s nullglob) চালু হয় এবং গ্লোববিংয়ের সাথে কোনও মিল না হয় তবে যুক্তিটি বাতিল করা হবে

সুতরাং, সম্পূর্ণ দৃust় সমাধানের জন্য , নিম্নলিখিতটি ব্যবহার করুন:

grep -R '--include=*.'{html,php,htm} pattern /some/path
  • '--include=*.'আক্ষরিক হিসাবে বিবেচিত হয় , একক-উদ্ধৃত হওয়ার কারণে ; এটি অবিচ্ছিন্ন ব্যাখ্যাটিকে *গ্লোববিং চরিত্র হিসাবে আটকায় ।

  • {html,php,htm}- প্রয়োজনীয়তা - unquoted বক্রবন্ধনী সম্প্রসারণ [1] , এর বিস্তৃতি 3 আর্গুমেন্ট, যা, কারণে {...} সরাসরি নিম্নলিখিত '...'টোকেন , অন্তর্ভুক্ত যে টোকেন।

  • অতএব, শেল দ্বারা উদ্ধৃতি অপসারণের পরে, নিম্নলিখিত 3 টি আক্ষরিক আর্গুমেন্ট শেষ পর্যন্ত প্রেরণ করা হবেgrep :

    • --include=*.html
    • --include=*.php
    • --include=*.htm

[1] আরও সঠিকভাবে, এটি কেবল ব্রেস প্রসারণের বাক্য গঠন-প্রাসঙ্গিক অংশগুলি অবশ্যই অবতীর্ণ হতে হবে, তালিকার উপাদানগুলি এখনও স্বতন্ত্রভাবে উদ্ধৃত করা যেতে পারে এবং যদি তাদের মধ্যে গ্লোব্বিং মেটাচারার রয়েছে তবে ব্রেস প্রসারণের পরে অবাঞ্ছিত গ্লোব্বিং হতে পারে; এই ক্ষেত্রে প্রয়োজনীয় না হলেও, উপরের হিসাবে লেখা যেতে পারে
'--include=*.'{'html','php','htm'}


4
এই পোস্টের জন্য আপনাকে অনেক ধন্যবাদ। দুর্দান্ত পোস্টগুলি কেবল প্রশ্নের উত্তর দেয় না তবে আপনাকে নতুন কিছু শেখায়! এটি বিশেষত আমাদের মধ্যে এমন কিছু লিখার জন্য দরকারী যা পসিক্স অনুগত হতে হবে। ম্যাক ওএস এক্স ব্যবহার করা যে কেউ এখানে দেখতে হবে!
সাবালবা

@ সাব্বালবা: এটি শুনে আমি আনন্দিত, তবে স্পষ্টভাবে জানাচ্ছি: যদিও বন্ধনী সম্প্রসারণ পসিক্স-অনুবর্তী নয়, এটি bashযে কোনও প্ল্যাটফর্মের সাথে কাজ bashকরে।
mklement0

9

ডাবল উদ্ধৃতি অপসারণ করার চেষ্টা করুন

grep --include=*.{html,php,htm} pattern -R /some/path

4
@ianyapiaozi চেষ্টা করুন grep --include=\*.{html,php,htm} pattern -R /some/path। এটা আমার জন্য কাজ করেছে।
হিউঞ্জুন কিম

4

এটা কি কাজ করছে না?

  grep pattern  /some/path/*.{html,php,htm} 

আসলে তা না. ফাইলগুলি উপ-ডিরেক্টরি উপ-ডিরেক্টরিতে থাকতে পারে
tianyapiaozi

2

এটা চেষ্টা কর. -r একটি পুনরাবৃত্তি অনুসন্ধান করবে। -s ফাইল খুঁজে পাওয়া যায় না ত্রুটিগুলি দমন করবে। -n আপনাকে সেই ফাইলের লাইন নম্বরটি প্রদর্শন করবে যেখানে প্যাটার্নটি পাওয়া গেছে।

    grep "pattern" <path> -r -s -n --include=*.{c,cpp,C,h}

এটি আমার পক্ষে বিশেষত সেরা উত্তর এবং আমি মনে করি আপনি -r -s -n এর পরিবর্তে -আরএসএন রাখতে পারেন (তবে এটি নিটপিকিং)।
পাতলা

সাধারণত আমি -আরএন ব্যবহার করি । উদাহরণটিতে স্বচ্ছতার জন্য আমাকে -r -n -s :-) উল্লেখ করতে হয়েছিল যে এটি খুশী হয়েছিল।
প্রদীপ

আমি -Iস্ট্যান্ডার্ড সেট যোগ করার পরামর্শ দিচ্ছি । এটি বাইনারি ফাইলগুলি এড়িয়ে যায় (যা খুব কমই অনুসন্ধান করা হয়) তাই দক্ষতা বাড়ায়। তারপরে আমরা grep -rIns ...যা যা যা শাব্দিকভাবে দুর্দান্তভাবে অভিনয় করে :)
রক্তাক্ত

2

এটি একই উদ্দেশ্যে কাজ করে তবে --includeবিকল্প ছাড়াই । এটি গ্রেপ 2.5.1 তেও কাজ করে।

grep -v -E ".*\.(html|htm|php)"

0

কমান্ড grepসহ ব্যবহার করুনfind

find /some/path -name '*.html' -o -name '*.htm' -o -name '*.php' -type f 
 -exec grep PATTERN {} \+

আপনি ব্যবহার করতে পারেন -regexএবং -regextypeবিকল্পও।

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