unix - Grep--exclude/ব্যবহার করুন-নির্দিষ্ট ফাইলের মাধ্যমে grep নয় এমন সিনট্যাক্স অন্তর্ভুক্ত করুন




search shell (15)

আমি স্ট্রিং foo= একটি ডিরেক্টরি গাছ টেক্সট ফাইল মধ্যে খুঁজছেন। এটি একটি সাধারণ লিনাক্স মেশিনে রয়েছে, আমার ব্যাশ শেল রয়েছে:

grep -ircl "foo=" *

ডিরেক্টরির মধ্যে "foo =" এর সাথে মেলে এমন অনেক বাইনারি ফাইল রয়েছে। এই ফলাফলগুলি প্রাসঙ্গিক নয় এবং অনুসন্ধানটি হ্রাস করার কারণে, আমি grep গুলো এই ফাইলগুলিতে অনুসন্ধান এড়িয়ে যেতে চাই (বেশিরভাগ JPEG এবং PNG চিত্র)। আমি যে কিভাবে করতে হবে?

আমি জানি - --exclude=PATTERN এবং - অন্তর্ভুক্ত --include=PATTERN অপশন, কিন্তু প্যাটার্ন বিন্যাস কি? জিপের ম্যান পৃষ্ঠাটি বলে:

--include=PATTERN     Recurse in directories only searching file matching PATTERN.
--exclude=PATTERN     Recurse in directories skip file matching PATTERN.

Grep অনুসন্ধান করা, grep অন্তর্ভুক্ত অন্তর্ভুক্ত , grep বাদে এবং রূপান্তর কিছু প্রাসঙ্গিক খুঁজে না

কিছু নির্দিষ্ট ফাইলে শুধুমাত্র grepping এর একটি ভাল উপায় থাকলে, আমি এটির জন্য সব করছি; আপত্তিকর ফাইল চলন্ত একটি বিকল্প নয়। আমি শুধুমাত্র নির্দিষ্ট ডিরেক্টরি অনুসন্ধান করতে পারি না (ডিরেক্টরি কাঠামো একটি বড় জগাখিচুড়ি, সর্বত্র সবকিছু দিয়ে)। এছাড়াও, আমি কিছু ইনস্টল করতে পারছি না, তাই আমাকে সাধারন সরঞ্জামগুলির সাথে করতে হবে (যেমন grep বা প্রস্তাবিত অনুসন্ধান )।


ডিরেক্টরির মধ্যে অনেক বাইনারি ফাইল। আমি শুধুমাত্র নির্দিষ্ট ডিরেক্টরি অনুসন্ধান করতে পারি না (ডিরেক্টরি গঠন একটি বড় জগাখিচুড়ি)। কিছু ফাইল শুধুমাত্র grepping একটি ভাল উপায় আছে?

ripgrep

এটি আপনার বর্তমান ডিরেক্টরিটি পুনরাবৃত্তি করার জন্য ডিজাইন করা দ্রুততম সরঞ্জামগুলির মধ্যে একটি। এটি সর্বাধিক দক্ষতা জন্য রস্ট এর regex ইঞ্জিন শীর্ষ নির্মিত, Rust মধ্যে লেখা হয়। এখানে বিস্তারিত বিশ্লেষণ চেক করুন

সুতরাং আপনি শুধু চালাতে পারেন:

rg "some_pattern"

এটা আপনার। .gitignore সম্মান এবং স্বয়ংক্রিয়ভাবে লুকানো ফাইল / ডিরেক্টরি এবং বাইনারি ফাইল এড়িয়ে যান।

আপনি এখনও -g / --glob ব্যবহার করে ফাইল এবং ডিরেক্টরি অন্তর্ভুক্ত বা অন্তর্ভুক্ত করতে পারেন। Globbing নিয়ম মেলে। .gitignore । সাহায্যের জন্য man rg চেক করুন।

আরো উদাহরণের জন্য, দেখুন: grep এর সাথে নির্দিষ্ট এক্সটেনশানগুলির সাথে মেলে না এমন কিছু ফাইল কিভাবে বাদ দেবেন?

MacOS এ, আপনি brew install ripgrep মাধ্যমে ইনস্টল করতে পারেন।


git grep

কর্মক্ষমতা জন্য অপ্টিমাইজ করা এবং কিছু নির্দিষ্ট ফাইলের মাধ্যমে অনুসন্ধান করার জন্য git grep ব্যবহার করুন।

ডিফল্টরূপে এটি বাইনারি ফাইলগুলিকে উপেক্ষা করে এবং এটি আপনার। .gitignore কে সম্মানিত করে। যদি আপনি Git কাঠামোর সাথে কাজ করেন না তবে আপনি এখনও --no-index পাস করে এটি ব্যবহার করতে পারেন।

উদাহরণ সিনট্যাক্স:

git grep --no-index "some_pattern"

আরো উদাহরণের জন্য দেখুন:

  • Git grep অনুসন্ধান থেকে নির্দিষ্ট ডিরেক্টরি / ফাইল বাদ কিভাবে ।
  • একাধিক স্ট্রিং বা regexes সব একটি ফাইল উপস্থিত থাকলে পরীক্ষা করুন

Grep 2.5.1-এ আপনাকে ~ / .bashrc বা ~ / .bash প্রোফাইলে এই লাইন যোগ করতে হবে

export GREP_OPTIONS="--exclude=\*.svn\*"

Grep থেকে সব বাইনারি ফলাফল উপেক্ষা করা

grep -Ri "pattern" * | awk '{if($1 != "Binary") print $0}'

Awk অংশ সব বাইনারি ফাইল foo ম্যাচ লাইন আউট ফিল্টার করা হবে


tcsh .alias ফাইলের জন্য উপযুক্ত:

alias gisrc 'grep -I -r -i --exclude="*\.svn*" --include="*\."{mm,m,h,cc,c} \!* *'

আমাকে কিছুক্ষণ ধরে ধরে নিল যে {মিমি, মি, এইচ, সিসি, সি} অংশ উদ্ধৃতির ভিতরে না থাকা উচিত। ~ কিথ


আপনি যদি find ব্যবহার করতে বিরত না হন, তবে আমি তার -prune বৈশিষ্ট্যটি পছন্দ করি:

find [directory] \
        -name "pattern_to_exclude" -prune \
     -o -name "another_pattern_to_exclude" -prune \
     -o -name "pattern_to_INCLUDE" -print0 \
| xargs -0 -I FILENAME grep -IR "pattern" FILENAME

প্রথম লাইনে আপনি যে ডিরেক্টরিটি সন্ধান করতে চান তা নির্দিষ্ট করুন। . (বর্তমান ডিরেক্টরি) উদাহরণস্বরূপ, একটি বৈধ পথ।

দ্বিতীয় এবং তৃতীয় লাইনগুলিতে, "*.png" , "*.gif" , "*.jpg" , এবং আরও কিছু ব্যবহার করুন। এদের মধ্যে অনেকেই -o -name "..." -prune ব্যবহার করুন -o -name "..." -prune গঠন হিসাবে আপনার নিদর্শন রয়েছে।

4 র্থ লাইনের জন্য আপনাকে অন্য -o (এটি "বা" খুঁজে find করার find নির্দিষ্ট করে), আপনার -print0 প্যাটার্নগুলি দরকার এবং -print0 শেষে আপনার একটি -print0 বা -print0 দরকার। যদি আপনি *.gif , *.png , ইত্যাদি চিত্রগুলি -o -print0 পরে বাকি "সব কিছু" চান তবে তারপরে -o -print0 ব্যবহার করুন এবং আপনার 4 র্থ লাইনটি সম্পন্ন হয়।

অবশেষে, 5 ম লাইনটি xargs এর পাইপ যা সেগুলির প্রত্যেকটি ফাইল গ্রহণ করে এবং একটি পরিবর্তনশীল FILENAME সঞ্চয় করে। এটি তারপর grep -- -IR ফ্ল্যাগগুলি, "pattern" পাস করে এবং তারপর FILENAME -IR দ্বারা প্রসারিত হয় যা ফাইলে থাকা ফাইলগুলির তালিকাটি find

আপনার বিশেষ প্রশ্নের জন্য, বিবৃতিটি এমন কিছু দেখতে পারে:

find . \
     -name "*.png" -prune \
     -o -name "*.gif" -prune \
     -o -name "*.svn" -prune \
     -o -print0 | xargs -0 -I FILES grep -IR "foo=" FILES


আমি একটি dilettante, মঞ্জুরিপ্রাপ্ত, কিন্তু এখানে আমার ~ /। Bash_profile দেখায় কিভাবে:

export GREP_OPTIONS="-orl --exclude-dir=.svn --exclude-dir=.cache --color=auto" GREP_COLOR='1;32'

মনে রাখবেন যে দুটি ডিরেক্টরি বাদ দেওয়ার জন্য, আমাকে --exclude-dir দুবার ব্যবহার করতে হয়েছিল।


আমি কখনও কখনও খুব সহায়ক হতে grepping grep এর আউটপুট খুঁজে পাচ্ছি:

grep -rn "foo=" . | grep -v "Binary file"

যদিও, এটি আসলে বাইনারি ফাইলগুলি অনুসন্ধান করা থেকে এটি বন্ধ করে না।


এই এক দেখুন।

grep --exclude="*\.svn*" -rn "foo=" * | grep -v Binary | grep -v tags

এটা চেষ্টা কর:

  1. --F অধীনে " --F " নামক একটি ফোল্ডার তৈরি করুন .. (অথবা অন্য ফোল্ডারটির নামকরণ করুন " --F " অর্থাৎ double-minus-F --F double-minus-F
  2. #> grep -i --exclude-dir="\-\-F" "pattern" *

খুঁজে এবং xargs আপনার বন্ধু। Grep এর --exclude এর পরিবর্তে ফাইল তালিকা ফিল্টার করতে তাদের ব্যবহার করুন

ভালো কিছু চেষ্টা করুন

find . -not -name '*.png' -o -type f -print | xargs grep -icl "foo="

ঠিক এই পরিস্থিতিতে জন্য ডিজাইন করা হয়, যা ack এ একটি চেহারা নিন। আপনার উদাহরণ

grep -ircl --exclude=*.{png,jpg} "foo=" *

হিসাবে Ack সঙ্গে সম্পন্ন করা হয়

ack -icl "foo="

কারণ অ্যান ডিফল্টরূপে বাইনারি ফাইলগুলিতে কখনও দেখায় না, এবং -r ডিফল্টরূপে চালু থাকে। এবং যদি আপনি শুধুমাত্র সিপিপি এবং এইচ ফাইল চান, তাহলে শুধু করবেন

ack -icl --cpp "foo="

যদি আপনি অ-পুনরাবৃত্তিমূলকভাবে অনুসন্ধান করেন তবে আপনি ফাইলের নামগুলির সাথে মেলে ধরতে গ্লপ নিদর্শনগুলি ব্যবহার করতে পারেন।

grep "foo" *.{html,txt}

এইচটিএমএল এবং txt অন্তর্ভুক্ত। এটি শুধুমাত্র বর্তমান ডিরেক্টরি অনুসন্ধান।

সাবডিরেক্টরিতে অনুসন্ধান করতে:

   grep "foo" */*.{html,txt}

সাবসবডিরেক্টরিতে:

   grep "foo" */*/*.{html,txt}

যদি আপনি বাইনারি ফাইলগুলি এড়িয়ে যেতে চান তবে আমি আপনাকে -I (উচ্চতর ক্ষেত্রে i) বিকল্পটি দেখানোর পরামর্শ দিই। এটা বাইনারি ফাইল উপেক্ষা করে। আমি নিয়মিত নিম্নলিখিত কমান্ডটি ব্যবহার করি:

grep -rI --exclude-dir="\.svn" "pattern" *

এটি পুনরাবৃত্তি করে অনুসন্ধান করে, বাইনারি ফাইলগুলিকে উপেক্ষা করে এবং আমি যে প্যাটার্নটি চাই তা জন্য সাবভার্সন লুকানো ফোল্ডারগুলির ভিতরে দেখায় না। আমি এটা আমার বক্সে "grepsvn" হিসাবে aliased আছে।


--binary-files=without-match GNU grep সাথে --binary-files=without-match বিকল্পটি বাইনারি ফাইলগুলি এড়িয়ে চলে। (সমতুল্য -I অন্যত্র উল্লিখিত সুইচ।)

(এটি grep সাম্প্রতিক সংস্করণটির প্রয়োজন হতে পারে; অন্তত 2.5.3 এটি আছে।)





grep