নির্দিষ্ট পথে কোনও ফাইল বাদ দিয়ে `গ্রেপ` চালান


12

আমি ./test/main.cppআমার অনুসন্ধান থেকে ফাইলটি বাদ দিতে চাই ।

আমি যা দেখছি তা এখানে:

$ grep -r pattern --exclude=./test/main.cpp
./test/main.cpp:pattern
./lib/main.cpp:pattern
./src/main.cpp:pattern

আমি জানি পাইপস এবং ফিল্টার বিন্যাসে একাধিক কমান্ড ব্যবহার করে যে আউটপুটটি আমি চাচ্ছি তা পাওয়া সম্ভব, তবে এমন কিছু উদ্ধৃতি / পলায়ন রয়েছে যা grepআমি কী চাই তা বুঝতে পারি?


আউটপুট ফিল্টার করার উপর ভিত্তি করে একটি সমাধান ভাল স্কেল করে না কারণ এটি সম্পর্কিত ফলাফল বাদ দিয়ে অকারণে ফাইলটি অনুসন্ধান করে। আমি পুরো ডিরেক্টরিগুলি (সহ --exclude-dir) বাদ দিতে চাইলে সমস্যাটি বড় হয়ে যায় । এজন্য আমি গ্রিপকে দেশীয়ভাবে বাদ দেওয়ার চেষ্টা করতে চাই।
নোবার


উত্তর:


6

grep একটি নির্দিষ্ট ডিরেক্টরিতে ফাইলের জন্য এটি করতে পারে না যদি আপনার যদি একই ডিরেক্টরিতে আরও বিভিন্ন ডিরেক্টরিতে ফাইল থাকে তবে পরিবর্তে সন্ধান করুন:

find . -type f \! -path './test/main.cpp' -exec grep pattern {} \+


আপনি পালাচ্ছেন \!এবং কেন \+? এটি ব্যাকস্ল্যাশগুলি বাদ দিয়ে দুর্দান্ত কাজ করছে বলে মনে হচ্ছে।
nober

@ নোবার আমি এটিতে অভ্যস্ত কারণ কিছু চরিত্র শেল কীওয়ার্ডস তাই আপনি কখনই অবাক হবেন না কারণ তারা পালিয়ে গেলে কিছুই ঘটতে পারে না।
মিশাল এইচ

"এটি grepকরতে পারে না, findপরিবর্তে ব্যবহার করুন" - নিখুঁত।
নোবার 20'15

4

জিএনইউ দিয়ে এটি সম্ভব বলে আমি মনে করি না grep। যদিও আপনার পাইপের দরকার নেই।

সহ find:

find . ! -path ./test/main.cpp -type f -exec grep pattern {} +

সহ zsh:

grep pattern ./**/*~./test/main.cpp(.)

(লুকানো ফাইলগুলিও বাদ দেয় ঠিক তেমনি .git, .svn ... বাদ দিতেও নয়)।


2

আমি একটি বই লিখতে পারি: "হারানো শিল্প xargs"। find ... -exec … ';লঞ্চ প্রতিটি ফাইলের জন্য একটি, grep (কিন্তু সঙ্গে বৈকল্পিক -exec … +না)। আচ্ছা, আমরা এই দিনগুলিতে সিপিইউ চক্র নষ্ট করছি তাই না কেন? তবে যদি পারফরম্যান্স এবং স্মৃতিশক্তি এবং শক্তি সমস্যা হয়: এক্সার্গস ব্যবহার করুন:

find . -type f \! -path 'EXCLUDE-FILE' -print0 | xargs -r0 grep 'PATTERN'

গনুহ এর find'র -print0হবে NULতার আউটপুট এবং -terminate xargs' -0ইনপুট হিসাবে যে বিন্যাস বিকল্প সন্মান। এটি আপনার ফাইলটিতে মজাদার চরিত্রগুলি নিশ্চিত করে, পাইপলাইন বিভ্রান্ত হবে না। -rবিকল্প ব্যাপারে নিশ্চিত হওয়ার ক্ষেত্রে কোন ত্রুটি তোলে findখুঁজে বের করে নেই।

দ্রষ্টব্য, আপনি এখন এই জাতীয় জিনিসগুলি করতে পারেন:

find . -type f -print0 | grep -z -v "FILENAME EXCLUDE PATTERN" | 
  xargs -r0 grep 'PATTERN'

জিএনইউ -zগ্রেপস xargs 'এর মতোই কাজ করে -0


3
কিছু আকর্ষণীয় নোট, তবে আমি নিশ্চিত না যে আপনি পারফরম্যান্স ইস্যু সম্পর্কে সঠিক। আমি বুঝতে পারছি এটা find -exec (cmd) {} +হিসাবে একই কাজ করে xargsএবং find -exec (cmd) {} \;একই কাজ করে xargs -n1। অন্য কথায়, আপনার বক্তব্যটি কেবলমাত্র সঠিক যদি \;সংস্করণটি ব্যবহৃত হয়।
নোবার

3
পাইপিং xargsব্যবহারের চেয়ে কম দক্ষ -exec … +(যদিও প্রান্তিকভাবে)। এখানে উত্তরগুলির কোনওটিরও উল্লেখ নেই -exec … \;
গিলস 21:59-

1
ভাল, এস - টি। আমি নিজেই ডেট। মন্তব্য এবং সংশোধন জন্য ধন্যবাদ। আমি ভেবেছিলাম \ + একটি টাইপো ছিল। ওহ দেখুন, -exec ... +জানুয়ারী 2005 এ যুক্ত হয়েছে Y হ্যাঁ, আমি পুরানো নই ... একেবারে ...।
ওথিউস

2

আপনার যদি findসমর্থন -pathযা 2008 সালে POSIX যোগ করা হয়েছিল কিন্তু এখনও সোলারিস অনুপস্থিত:

find . ! -path ./test/main.cpp -type f -exec grep pattern /dev/null {} +

1
আমি মনে করি না যে নোবার অন্যান্য ডিরেক্টরিতে মেইন.পি.পি চাইবে কাজ করবে
এরিক

1
আপনার প্যাটার্নটি অন্য সমস্ত ডিরেক্টরি থেকেও মেইন.কেপ্পকে বাদ দেবে না? এটি কাম্য হবে না
এরিক রেনোফ

@ এরিকরেনুফ: ওহ, আমার ভুল, ভুল পড়া। আমার উত্তর আপডেট।
cuonglm

@ গিলস: পসিক্স -pathহয় না কেন ?
cuonglm

আহ, দুঃখিত, আমার ভুল, এটি ২০০৮ সালে যুক্ত করা হয়েছে। যদিও সোলারিস থেকে এখনও নিখোঁজ।
গিলস 'অশুভ হওয়া বন্ধ করুন'

1

রেকর্ডের জন্য, আমি যে পছন্দটিকে পছন্দ করি তা এখানে:

grep pattern $(find . -type f ! -path './test/main.cpp')

grepকমান্ডের শুরুতে রেখে , আমি মনে করি এটি কিছুটা স্পষ্ট - প্লাস এটি grepরঙিন হাইলাইটিং অক্ষম করে না । এক অর্থে, findকমান্ড-প্রতিস্থাপনে ব্যবহার করা grepএর কার্যকারিতাটির (সীমাবদ্ধ) ফাইল-সন্ধানের উপসেটটি বাড়ানো / প্রতিস্থাপনের এক উপায় ।


আমার কাছে find -execসিনট্যাক্স এক ধরণের আরকেন। এর মধ্যে একটি জটিলতা find -execহ'ল (কখনও কখনও) বিভিন্ন চরিত্রের পালানোর প্রয়োজন (বিশেষত যদি \;বাশের অধীনে ব্যবহৃত হয়)। জিনিসগুলিকে পরিচিত প্রসঙ্গে রেখে দেওয়ার উদ্দেশ্যে, নিম্নলিখিত দুটি কমান্ড মূলত সমতুল্য:

find . ! -path ./test/main.cpp -type f -exec grep pattern {} +
find . ! -path ./test/main.cpp -type f -print0 |xargs -0 grep pattern

আপনি যদি সাব-ডিরেক্টরিগুলি বাদ দিতে চান তবে একটি ওয়াইল্ডকার্ড ব্যবহার করা প্রয়োজন হতে পারে। আমি এখানে স্কিমাটি পুরোপুরি বুঝতে পারি না - আরকেন সম্পর্কে কথা বলি :

grep pattern $(find . -type f ! -path './test/main.cpp' ! -path './lib/*' )

স্ক্রিপ্টগুলিতে ব্যবহারের জন্যfind ভিত্তিক সমাধানগুলি সাধারণকরণের জন্য আরও একটি নোট : grepকমান্ড-লাইনে -H/ --with-filenameবিকল্পটি অন্তর্ভুক্ত করা উচিত । অন্যথায় এটি এই পরিস্থিতিতে আউটপুট ফর্ম্যাটিকে পরিবর্তন করবে যে সন্ধানের ফলাফলগুলিতে কেবলমাত্র একটি ফাইলের নাম থাকতে পারে find। এটি উল্লেখযোগ্য কারণ এটি যদি প্রয়োজনীয় হয় না তবে এটির প্রয়োজনীয় grepফাইল-সন্ধান ( -rবিকল্পের সাথে) ব্যবহার করে।

... আরও ভাল, যদিও /dev/nullঅনুসন্ধানের জন্য প্রথম ফাইল হিসাবে অন্তর্ভুক্ত করা উচিত। এটি দুটি সমস্যার সমাধান করে:

  • এটি সুনিশ্চিত করে যে অনুসন্ধানের জন্য যদি একটি ফাইল থাকে, তবে সেখানে grepদুটি আছে এবং একাধিক-ফাইল আউটপুট মোড ব্যবহার করবে will
  • এটি সুনিশ্চিত করে যে যদি অনুসন্ধানের জন্য কোনও ফাইল না থাকে তবে তারা grepমনে করবে যে সেখানে একটি ফাইল আছে এবং স্টিডিনের জন্য অপেক্ষা না করে।

সুতরাং চূড়ান্ত উত্তরটি হ'ল:

grep pattern /dev/null $(find . -type f ! -path './test/main.cpp')

findকমান্ড প্রতিস্থাপনে আপনার আউটপুট ব্যবহার করা উচিত নয় । স্পেস বা অন্যান্য বিশেষ অক্ষরযুক্ত ফাইলের নাম থাকলে এটি বিরতি দেয়। ব্যবহার করুন find -exec, এটি শক্তিশালী এবং সহজেই ব্যবহারযোগ্য।
গিলস 21:55-

@ গিলস: খুব ভাল পয়েন্ট - এছাড়াও আউটপুট সম্ভবত কিছু প্রোগ্রামের কমান্ড-লাইন আকারের সীমা অতিক্রম করতে পারে। গুহাত সম্রাট
nober

বিতৃষ্ণা। 'সন্ধান করুন' সিনট্যাক্স মারাত্মকভাবে কঠিন। '-o' হ'ল "বা" অপারেটর (লিনাক্সে '-ও'), তবে এটি সাধারণ ব্যবহার (উদাহরণস্বরূপ '-প্রিউন' সহ) কোনও যৌক্তিক বা ধারণার ক্ষেত্রে ধারণাগতভাবে মানচিত্র দেয় না। এটি একটি কার্যকরী বা লজিকাল বা এর চেয়ে বেশি।
নোবার

আরেকটি উপায় একটি নাম মিলে উপর ভিত্তি করে সাবডিরেক্টরি বাদ দেওয়ার: find -iname "*target*" -or -name 'exclude' -prune। ভাল, এটি কাজ সাজানোর - ছাঁটাই ডিরেক্টরি তালিকাভুক্ত করা হবে, কিন্তু অনুসন্ধান করা হবে না। আপনি এটা তালিকাভুক্ত না চান তাহলে, আপনি অপ্রয়োজনীয় কেমন সংযুক্ত করতে পারবেন! -name 'exclude'
nobar
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.