আমি কীভাবে গ্রেপ-আর থেকে ডিরেক্টরিগুলি বাদ দিতে পারি?


668

আমি "নোড_মডিউলস" ডিরেক্টরি বাদে সমস্ত উপ-ডিরেক্টরিকে অতিক্রম করতে চাই।



14
কেবল "ম্যান গ্রেপ" টাইপ করুন এবং আপনি ঠিক সেখানে তালিকাভুক্ত - এবং অন্তর্ভুক্ত - এক্সক্লুড-ডির বিকল্পগুলি দেখতে পাবেন - এই প্রশ্নের শিরোনাম থেকে, আমি ধরে নিচ্ছি যে আপনি ইতিমধ্যে
গ্রেপ

34
আপনি যদি একটি Git সংগ্রহস্থলের মধ্যে কোডের জন্য grepping এবং হয় node_modulesআপনার মধ্যে আছে .gitignore, git grep "STUFF"সবচেয়ে সহজ উপায়। git grepঅনুসন্ধান কাজ গাছে ট্র্যাক ফাইল, থেকে সবকিছু উপেক্ষা.gitignore
0xcaff

2
নোডের একটি উদাহরণ: grep -R --exclude-dir={node_modules,bower_components} "MyString" | cut -c1-"$COLUMNS"- আরও আপনি সর্বদা শেলটিতে এটিকে 'নোডগ্রিপ' বা যা কিছু করতে পারেন এবং স্ট্রিং ইনপুট হিসাবে একটি কমান্ড আর্গুমেন্ট ব্যবহার করতে পারেন ..
বিসিয়া

উত্তর:


394

সমাধান 1 (একত্রিত findএবং grep)

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

findডিরেক্টরি foo এবং বার বাদে ব্যবহার করুন :

find /dir \( -name foo -prune \) -o \( -name bar -prune \) -o -name "*.sh" -print

তারপরে পোর্টেবল সমাধান হিসাবে একত্রিত করুন findএবং পুনরাবৃত্তিযোগ্য ব্যবহার করুন grep:

find /dir \( -name node_modules -prune \) -o -name "*.sh" -exec grep --color -Hn "your text to find" {} 2>/dev/null \;

সমাধান 2 (এর পুনরাবৃত্তি ব্যবহার grep):

আপনি ইতিমধ্যে এই সমাধানটি জানেন তবে এটি সর্বাধিক সাম্প্রতিক এবং কার্যকর সমাধান হওয়ায় আমি এটি যুক্ত করছি। দ্রষ্টব্য এটি কম বহনযোগ্য সমাধান তবে আরও মানব-পঠনযোগ্য।

grep -R --exclude-dir=node_modules 'some pattern' /path/to/search

একাধিক ডিরেক্টরি বাদ দিতে, --exclude-dirহিসাবে ব্যবহার করুন :

--exclude-dir={node_modules,dir1,dir2,dir3}

সমাধান 3 (এগ্রি)

যদি আপনি ঘন ঘন কোডের মাধ্যমে অনুসন্ধান করেন তবে অ্যাগ্র (দ্য সিলভার সন্ধানকারী) গ্রেপের একটি খুব দ্রুত বিকল্প, এটি অনুসন্ধানের কোডের জন্য কাস্টমাইজড। উদাহরণস্বরূপ, এটি তালিকাভুক্ত ফাইল এবং ডিরেক্টরিগুলি স্বয়ংক্রিয়ভাবে উপেক্ষা করে .gitignore, তাই আপনার grepবা একইরকম জটিল বর্জনীয় বিকল্পগুলি পাস করতে হবে না find


2
এই সংমিশ্রণটি দ্রুততর অনুসন্ধান করে --exclude-dir=dirএবং এটি রঙ সহ ফলাফলগুলি দেখায় - সহজেই পড়তে পারে
ম্যাক্সিম ইয়েফ্রেমভ

27
"এই সংমিশ্রণ" আমার find ... -execচেয়ে দ্রুত নয় grep --exclude-dir। গ্রেপ করার বিশাল সুবিধা (যদি আপনি এইচডিডি-তে 38 কে + এর বাইরে ফিল্টারযুক্ত 26 কে + ফাইলের সাথে পাঁচগুণ বেশি দ্রুত) না থাকেন তবে আপনি যদি সন্ধান / এক্সিকিউটি কম্বোটির \;সাথে প্রতিস্থাপন না করেন +। তারপরে গ্রেপ প্রায় 30% দ্রুত "কেবল" হয়। গ্রেপ বাক্য গঠনটিও মানব-পঠনযোগ্য :)।
কেজেল আন্দ্রেয়াসেন

সম্মত, যেহেতু এটি সুস্পষ্ট। কিছু ব্যস্তবক্সে জিআরইপি কমান্ড নেই।
হর্নেটবেজ

10
এছাড়াও উল্লেখ করছি যে আপনি একাধিক --exclude-dir={dir1,dir2}
বর্জন

4
আমি সামান্য বিস্মিত না যে node_modulesক্যানোনিকাল উদাহরণ।
pdoherty926

981

জিএনইউ গ্রেপ (> = 2.5.2 ) এর সাম্প্রতিক সংস্করণগুলি সরবরাহ করে:

--exclude-dir=dir

যা dirপুনরাবৃত্ত ডিরেক্টরি অনুসন্ধান থেকে প্যাটার্নের সাথে মেলে ডিরেক্টরিগুলি বাদ দেয় ।

সুতরাং আপনি এটি করতে পারেন:

grep -R --exclude-dir=node_modules 'some pattern' /path/to/search

বাক্য গঠন এবং ব্যবহার সম্পর্কিত আরও কিছু তথ্যের জন্য দেখুন

পুরোনো গনুহ Greps এবং জন্য POSIX Grep , ব্যবহার findঅন্যান্য উত্তর প্রস্তাবিত।

বা কেবল ব্যবহার করুন ack( সম্পাদনা করুন : বা সিলভার অনুসন্ধান ) এবং এটি দিয়ে সম্পন্ন করুন!


4
@ মানোচো: আপনি যদি ackদুর্দান্ত মনে করেন , সিলভার অনুসন্ধানকারী চেষ্টা করুন এবং গতি বৃদ্ধি দেখুন!
জনসিওয়েব

30
অধৈর্য জন্য সিনট্যাক্স: শেলের ফাইল গ্লোবিং নয় , এর নিয়মিত অভিব্যক্তি বিন্যাস --exclude-dir=dirব্যবহার grepকরে । প্যাটার্নগুলি আপনার বর্তমান ডিরেক্টরি অনুসারে পথে কাজ করে। সুতরাং প্যাটার্ন ব্যবহার করুন , না । --exclude-dir=dir--exclude-dir="/root/dir/*"
ট্যানিয়াস

15
আপনি সন্ধানের থেকে একাধিক dirs অগ্রাহ্য করতে চান, সেখানে ব্যবহার করার চেয়ে একটি ভাল বিকল্প: $ grep -r --exclude-dir=dir1 --exclude-dir=dir2 "string" /path/to/search/dir?
দর্শনা চৌধুরী চৌধুরী

4
আমি সম্ভবত কোনও বুদ্ধিমান ব্যক্তির চেয়ে এই সময়টিতে অনেক বেশি সময় ব্যয় করেছি, তবে কীভাবে অনুসন্ধান - grep -r --exclude-dir=public keyword .কাজ থেকে একটি উপ-ডিরেক্টরিকে বাদ দিতে হবে তা আমার জীবনের জন্য আমি নির্ধারণ করতে পারি না - কাজ grep -r --exclude-dir='public/dist' keyword .করে না। আমি রেজেক্স ওয়াইল্ডকার্ড যুক্ত করার চেষ্টা করেছি, অক্ষরগুলি রক্ষা পেয়েছি ইত্যাদি, তবে কিছুই সাহায্য করছে বলে মনে হচ্ছে না।
dkobozev

72
এর মতো একাধিক ডিরেক্টরি বাদ দিন:grep -r "Request" . --exclude-dir={node_modules,git,build}
maverick97

77

আপনি যদি একাধিক ডিরেক্টরি বাদ দিতে চান :

পুনরাবৃত্তির জন্য "আর", কেবলমাত্র ম্যাচযুক্ত ফাইলগুলির নাম মুদ্রণের জন্য "l" এবং কেসের পার্থক্য উপেক্ষা করার জন্য "i":

grep -rli --exclude-dir={dir1,dir2,dir3} keyword /path/to/search

উদাহরণ: আমি এমন ফাইলগুলি খুঁজতে চাই যাতে 'হ্যালো' শব্দটি থাকে। প্রোক ডিরেক্টরি, বুট ডিরেক্টরি, সিএস ডিরেক্টরি এবং মূল ডিরেক্টরি বাদে আমি আমার সমস্ত লিনাক্স ডিরেক্টরি অনুসন্ধান করতে চাই :

grep -rli --exclude-dir={proc,boot,root,sys} hello /

দ্রষ্টব্য: উপরের উদাহরণটি মূল হওয়া দরকার

নোট 2 (@ এসপিপ্লুঙ্কারিন অনুসারে): কমাতে প্রবেশের পরে স্পেস যুক্ত করবেন না {dir1,dir2,dir3}


5
দ্রষ্টব্য:{dir1,dir2,dir3}
কমাতে প্রবেশের

ধন্যবাদ, এসভিএন ওয়ার্কস্পেসের মাধ্যমে গ্রেপ করার সময় হ্যান্ডি:grep -Irsn --exclude-dir=.svn 'foo' .
র্যাম 237

1
আপনি কেবল --exclude-dirএকাধিকবার বিকল্পটি সরবরাহ করতে পারেন ।
ওয়াল্ফ

44

এই বাক্য গঠন

--exclude-dir={dir1,dir2}

শেল দ্বারা প্রসারিত হয় (যেমন বাশ), এর দ্বারা নয় grep:

--exclude-dir=dir1 --exclude-dir=dir2

উদ্ধৃতি শেলটিকে প্রসারিত হতে বাধা দেবে, সুতরাং এটি কাজ করবে না:

--exclude-dir='{dir1,dir2}'    <-- this won't work

এর সাথে ব্যবহৃত --exclude-dirনিদর্শনগুলি --excludeবিকল্পের জন্য ম্যান পৃষ্ঠাতে বর্ণিত একই ধরণের নিদর্শন :

--exclude=GLOB
    Skip files whose base name matches GLOB (using wildcard matching).
    A file-name glob can use *, ?, and [...]  as wildcards, and \ to
    quote a wildcard or backslash character literally.

শেলটি সাধারণত এ জাতীয় ধরণটি নিজেই প্রসারিত করার চেষ্টা করবে , তাই এড়াতে আপনার এটিকে উদ্ধৃত করা উচিত:

--exclude-dir='dir?'

আপনি কোঁকড়ানো ধনুর্বন্ধনী এবং উদ্ধৃত বর্জন নিদর্শন একসাথে এইভাবে ব্যবহার করতে পারেন:

--exclude-dir={'dir?','dir??'}

একটি নিদর্শন একাধিক পাথ বিভাগকে বিস্তৃত করতে পারে:

--exclude-dir='some*/?lse'

এটির মতো ডিরেক্টরি বাদ দেবে topdir/something/else


13

প্রায়শই এটি ব্যবহার করুন:

grep-r(পুনরাবৃত্ত হওয়া), i(কেস উপেক্ষা) এবং -o(কেবলমাত্র লাইনের অংশের সাথে মিলে যাওয়া অংশগুলি প্রিন্ট করে ) ব্যবহার করে ব্যবহার করা যেতে পারে । filesব্যবহার বাদ দিতে --excludeএবং ডিরেক্টরি ব্যবহার বাদ দিতে --exclude-dir

এটি একসাথে রেখে আপনি এমন কিছু দিয়ে শেষ করেন:

grep -rio --exclude={filenames comma separated} \
--exclude-dir={directory names comma separated} <search term> <location>

এটিকে বর্ণনা করা এটিকে শোনার চেয়ে আরও জটিল করে তোলে। একটি সাধারণ উদাহরণ সহকারে বর্ণনা করা সহজ।

উদাহরণ:

মনে করুন যে আমি debuggerডিবাগিং সেশনের সময় স্পষ্টভাবে স্ট্রিংয়ের মানটি সেট করেছিলাম সেই জায়গাগুলির জন্য আমি বর্তমান প্রকল্পটি সন্ধান করছি এবং এখন পর্যালোচনা / অপসারণ করতে চাই।

আমি একটি স্ক্রিপ্ট কল করি findDebugger.shএবং grepসমস্ত উপস্থিতি খুঁজে পেতে ব্যবহার করি । যাহোক:

ফাইলের ব্যাতিক্রমের জন্য - আমি নিশ্চিত করতে চাই যে .eslintrcতা উপেক্ষা করা হবে না (এটিতে debuggerঅবশ্যই এর বাদ দেওয়ার নিয়ম রয়েছে তাই এটি বাদ দেওয়া উচিত)। তেমনি, আমি চাই না যে আমার নিজস্ব স্ক্রিপ্ট কোনও ফলাফলের জন্য রেফারেন্স করা হোক।

ডিরেক্টরি বাদ পড়ার জন্য - আমি বাদ দিতে চাই node_modulesকারণ এতে প্রচুর লাইব্রেরি রয়েছে যা রেফারেন্স দেয় debuggerএবং আমি এই ফলাফলগুলিতে আগ্রহী নই। এছাড়াও আমি কেবল ডিরেক্টরিগুলি গোপন করতে .ideaএবং গোপনীয় করতে .gitচাই কারণ আমি সেই অনুসন্ধানগুলির অবস্থানগুলির বিষয়েও পাত্তা দিই না এবং অনুসন্ধান সম্পাদন রাখতে চাই।

সুতরাং এখানে ফলাফল - আমি একটি স্ক্রিপ্ট তৈরি করি যার findDebugger.shসাথে ডাকা হয়:

#!/usr/bin/env bash
grep -rio --exclude={.eslintrc,findDebugger.sh} \
--exclude-dir={node_modules,.idea,.git} debugger .

আমি বিশ্বাস করি যে "আর" বিকল্পটি একটি বড় ক্ষেত্রে "-আর" দিয়ে মুদ্রিত করা উচিত।
হর্নেটবেজ

1
মজাদার. "আর" আমার কাছে সর্বদা নিক এবং ম্যাকের জন্য কাজ করেছে।
আর্কসেল্ডন

আমি যখন আমার উত্তর লিখলাম , আমি ব্যবহার করেছি -R(কেন এখন তা মনে নেই)। আমি সাধারণত ব্যবহার -r। দেখা যাচ্ছে যে বড় হাতের সংস্করণটি প্রতিলিঙ্কগুলি অনুসরণ করে । তিল।
জনসিওয়েব

@ জনসিওয়েব - ধন্যবাদ আপনার উত্তরটিকে
উচ্চতর করে তুলেছে

10

আপনি কিছু চেষ্টা করতে পারে grep -R search . | grep -v '^node_modules/.*'


34
কিছু ক্ষেত্রে যেমন একটি ভাল সমাধান না। উদাহরণস্বরূপ: যদি 'নোড_মডিউলস' ডিরেক্টরিটি প্রচুর মিথ্যা ধনাত্মক মিল রয়েছে (সুতরাং ডিরেক্টরিটি ফিল্টার করার প্রয়োজন হয়) তবে প্রথম গ্রেপ একটি সাব-ডিরেক্টরিতে অনুসন্ধান করতে অনেক সময় নষ্ট করে এবং দ্বিতীয় গ্রেপ ফিল্টারিং করে ম্যাচ আউট। প্রথম গ্রেপ থেকেই নোড_মডিউলগুলি বাদ দেওয়া আরও দ্রুত।
গুরুএম


1
গুরুর মন্তব্যের জন্য দিতো। /varযখন /var/runআমার ক্ষেত্রে এটি আঘাত হানে তখন একটি গ্রেপ হ্যাঙ্গ হয় । এই কারণে আমি ডিরেক্টরিটি প্রথম স্থানে এড়াতে চাই।
jww

3
--exclude-dir2016. হিসাবে সবচেয়ে ভালো সমাধান হয়
ওমর তারিক

10

আপনি যদি গিট সংগ্রহস্থলের কোডের জন্য গ্রেপিং করে থাকেন node_modulesএবং আপনার মধ্যে থাকেন তবে .gitignoreআপনি ব্যবহার করতে পারেন git grepgit grepথেকে সমস্ত কিছু উপেক্ষা করে কার্যকারী গাছের মধ্যে ট্র্যাক করা ফাইলগুলি অনুসন্ধান করে.gitignore

git grep "STUFF"

এটি খুব দরকারী টিপ। ধন্যবাদ।
এনকেএম

4

খুব দরকারী, বিশেষত যারা নোড.জেএস নিয়ে কাজ করে তাদের জন্য যেখানে আমরা "নোড_মডিউলস" এর ভিতরে অনুসন্ধান এড়াতে চাই:

find ./ -not -path "*/node_modules/*" -name "*.js" | xargs grep keyword

2

একটি সাধারণ ওয়ার্কিং কমান্ড:

root/dspace# grep -r --exclude-dir={log,assetstore} "creativecommons.org"

বর্তমানের ডিরেক্টরি "dspace" এ "ক্রিয়েটিভকমসন.আর.এস." পাঠ্যের জন্য আমি গ্রেপের উপরে এবং ডায়ার্স {লগ, সম্পত্তির দোকান exc বাদ দিন}

সম্পন্ন.


ব্র্যাকেটে বেশ কয়েকটি ডিরেক্টরি সহ ঝরঝরে
মিজো

2

অনেকগুলি সঠিক উত্তর এখানে দেওয়া হয়েছে, তবে আমি এটির সাথে একটি পয়েন্টকে জোর দেওয়ার জন্য যুক্ত করছি যার ফলে কিছু তাড়াতাড়ি প্রচেষ্টা ব্যর্থ হওয়ার আগে ঘটেছে: exclude-dirএকটি প্যাটার্ন নেয় , কোনও ডিরেক্টরিতে পাথ না।

আপনার অনুসন্ধানটি বলুন:

grep -r myobject

এবং আপনি লক্ষ্য করেছেন যে আপনার ফলাফলটি ফলাফলের সাথে বিশৃঙ্খলাবদ্ধ src/other/objects-folder। এই আদেশটি আপনাকে পছন্দসই ফলাফল দেবে না :

grep -r myobject --exclude-dir=src/other/objects-folder

এবং আপনি ভাবতে পারেন কেন exclude-dirকাজ করছে না! এর থেকে ফলাফলগুলি বাদ দেওয়ার জন্য objects-folder, কেবল এটি করুন:

grep -r myobject --exclude-dir=objects-folder

অন্য কথায়, কেবল ফোল্ডারের নাম ব্যবহার করুন পথটি নয় । স্পষ্টত একবার আপনি এটি জানতে পারবেন।

ম্যান পৃষ্ঠা থেকে:

--excolve-dir = GLOB GLOB
প্যাটার্নের সাথে মেলে এমন নামের প্রত্যয় সহ যে কোনও কমান্ড-লাইন ডিরেক্টরি ছেড়ে যান। পুনরাবৃত্তভাবে অনুসন্ধান করার সময়, কোনও মূল ডিরেক্টরিকে এড়িয়ে যান যার বেস নামটি জিএলওবির সাথে মেলে। জিএলওবিতে কোনও রিলান্ডেন্ট ট্রেলিং স্ল্যাশ উপেক্ষা করুন।


2

এটি আমার জন্য কাজ করে:

grep <stuff> -R --exclude-dir=<your_dir>

5
এই উত্তরটি ইতিমধ্যে পোস্ট করা থেকে কীভাবে আলাদা?
এক্সেল


-1

একটি সহজ উপায় হ'ল "গ্রেপ-ভি" ব্যবহার করে আপনার ফলাফলগুলি ফিল্টার করা।

grep -i needle -R * | grep -v node_modules


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