রিকার্সিভ গ্রেপ: নির্দিষ্ট ডিরেক্টরি বাদ দিন


49

সুনির্দিষ্ট সামগ্রী সহ উত্স ফাইলগুলি অনুসন্ধান করতে আমি প্রচুর রিকারসিভ গ্রেপ ব্যবহার করি।

grep -Rni "myfunc" .

বৃহত্তর কোডবেসে, এটি ধীর হয়ে যেতে পারে, তাই আমি শোধক / এক্সটেনশানগুলিকে সীমাবদ্ধ করতে / ইনক্লুডু ব্যবহার করি।

grep -Rni --include=*.java "myfunc" .

তবে পুরো উপ-ডিরেক্টরিকে বাদ দিয়ে (ছাঁটাই করা) আরও দক্ষ হবে, আমি ভাবছি:

grep -Rni --exclude=/.svn/ "myfunc" .

তবে - এক্সক্লুড কেবল উপরে *। জাভা ফাইলের ধরণগুলি সমর্থন করে। আমি কীভাবে ডিরেক্টরিগুলি বাদ দিতে পারি?

উত্তর:


10

আপনি ack মধ্যে তাকান হতে পারে ।

আমি এটি ব্যবহার শুরু করেছি তবে এটি এটির পক্ষে উপযুক্ত seems


আক্ক দেখতে বেশ ভাল লাগছে। চমৎকার যে এটি স্বজ্ঞাতভাবে অযাচিত ফাইলগুলি বাদ দেয়। --nogroup বিকল্পটি গ্রেপ
রনি-

2
আক কিছুটা ধীর। আপনি সিলভার অনুসন্ধানকারী (এজি) বা রিপগ্রিপ (আরজি) চেষ্টা করতে পারেন।
ব্যবহারকারীর 131389

62
grep -r --exclude-dir=dev --exclude-dir=sys --exclude-dir=proc PATTERN data

সূত্র: https://stackoverflow.com/questions/2799246/grep-excluding-a-specific-folder- using


17
নোট করুন যে এটি পুনরাবৃত্তিভাবে বাদ দেয়। ./devসমস্ত সহ বাদ দেওয়া হবে ./foo/bar/dev--exclude-dir=./devশুধুমাত্র প্রথম ক্ষেত্রে প্রয়োগ করতে ব্যবহার করুন ।
কোরি ওয়াকার

4
আপনি গ্লোববিং করে এটিকে কিছুটা ছোটও করতে পারেন: bash grep -r --exclude-dir={dev,sys,proc} PATTERN data গ্লোব্বিংয়ের সাথে একমাত্র সমস্যা হ'ল আমি এটি আমার বাশে কাজ করতে পারি না। সেক্ষেত্রে আমাকে আলাদা রাখতে হবে।
b01

3
এছাড়াও উল্লেখ করা হয়েছে যে 1} কেবলমাত্র যদি আপনি 1 টির বেশি এন্ট্রি রাখেন, তার অর্থ --excule-dir = {হোম, .svn works কাজ করে তবে --excule-dir = {। Svn not কাজ করবে না। Work} কেন কাজ করে না তা নির্ধারণের জন্য আমার সময় নষ্ট হয় কারণ আমি প্রথম স্থানটিতে 1 টি প্রবেশ দিয়ে পরীক্ষা করি।
21

আপনি যদি {}একটি একক প্রবেশের সাথে ব্যবহার করেন তবে সম্ভবত এটির অ্যারে তৈরি করার জন্য আপনার একটি অ্যানারি কমা প্রয়োজন (বাশ কীভাবে এটি পরিচালনা করে তা নিশ্চিত নয়)। এটি না করে আমি আমার .বাশ_আলিয়াসে এমন একটি উপাত্ত তৈরি করে শেষ করেছি যা আমি সাধারণত সর্বদা বাদ দিতে চাই, যেমন .git, .svn, .hg, .cache, এবং তারপরে একটি লুপের মাধ্যমে এগুলি যুক্ত করি fold --exclude-dir $dirএবং তারপরে গ্রে অ্যারেফটিতে সেই অ্যারেটি প্রসারিত করুন।
ড্রাগন 788

6

আপনি পরিবর্তে এটি ব্যবহার করতে পারেন:

find . -not -path "*/.svn*" -not -type d -exec grep -ni "myfunc" {} \; -print

ঠিক আছে, সুতরাং এটি কিছুটা পিছনের দিকে, আপনি প্রথমে গ্রেপ ফলাফল এবং তারপরে পাথ পান। অন্য কারও কাছে এর চেয়ে ভাল উত্তর থাকতে পারে?


3
ঠিক আছে, আমি এটা অনেক পছন্দ করি। অবশ্যই খুঁজে পেতে অনেক বেশি নমনীয়। আউটপুটটির মধ্যে কেবলমাত্র পার্থক্য হ'ল "গ্রেপ -আরনি" প্রতিটি ম্যাচের ফাইলের নাম মুদ্রণ করবে, যেখানে "ফাইন্ড-এক্সেক গ্রেপ" ফাইলের নাম এক লাইনে এবং তারপরে প্রতিটি ম্যাচের জন্য একটি লাইন মুদ্রণ করবে (লাইন নম্বর এবং রেখার সামগ্রী সহ) )। "গ্রেপ-হ্নি" ব্যবহার করে ফাইলের
নামটি

একমাত্র উত্তর প্রদানের জন্য আপনাকে ধন্যবাদ যা এই ক্রাস্টি সিস্টেমগুলির জন্য কাজ করেছে, গ্রেপ ছাড়াই - এক্সক্লুড-দির, তবে এখনও কাজ করা উচিত
দিমিত্রি ডিবি

2

এখানে আমার প্রকল্পগুলির একটির স্ক্রিপ্টের সম্পূর্ণ উদাহরণ যা সাহায্য করতে পারে, আমি এই ফাইলটিকে "all_source" (এক্সিকিউটেবল হিসাবে চিহ্নিত) বলি এবং এটিকে আমার প্রকল্পের মূল ডিয়ারের মধ্যে grep myfunc $(./all_source)রেখে দিই তবে একে স্ক্রিপ্টের শেষে সাজানোর মতো বলি সম্পূর্ণরূপে ঐচ্ছিক।

#!/bin/bash

find . \
    -type d \( \
            -wholename './lib' -o \
            -wholename './vc6' -o \
            -name 'gen' -o \
            -name '.svn' \
            \) -prune -o \
    -type f \( \
            -name '*.h' -o \
            -name '*.cpp' -o \
            -name '*.c' -o \
            -name '*.lua' -o \
            -name '*.*awk' \) -print \
    | sort

এই স্ক্রিপ্টটি প্রকল্পের সমস্ত ফাইলের নাম মিলে যা *.h, *.cpp, *.c, *.lua, *.*awkপ্রত্যাখ্যান করে তবে .svn এবং জেনার ফোল্ডার নামের সমস্ত ফোল্ডার সন্ধান করে না এবং এর জন্য ./libএবং ./vc6(কেবলমাত্র প্রকল্পের মূলের বাইরে থাকা) ফোল্ডারগুলি এড়িয়ে চলে । সুতরাং আপনি যখন grep myfunc $(./all_source)এই ফাইলগুলিতে কেবল গ্রেপ করবেন। আপনার প্রকল্পের মূল দিক থেকেও এটি কল করতে হবে।


0

সন্ধানের জন্য -প্রিন্ট অপশনটিও রয়েছে:

 find . -path "*/.svn*" -prune -o -not -type d -exec grep -ni "myfunc" {} \; -print

0

আপনি এটি করার চেষ্টা করতে পারেন:

grep -R  "myfunc" . | grep -v path_to_exclude/

উদাহরণস্বরূপ: আপনি লগ ফাইলগুলিতে সামগ্রীটি অনুসন্ধান করতে না চাইলে কেবল নিম্নলিখিতটি করুন:

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