গ্রেপ-এ ফাইলগুলির তালিকা কীভাবে পাস করব?


98

আমি যে findফাইলগুলির grepমধ্য দিয়ে যেতে চাইছি তার একটি তালিকা ব্যবহার এবং করছি । আমি কীভাবে সেই তালিকাটি পাইপ করব grep?

উত্তর:


116

ওয়েল, জেনেরিক কেস যে স্ট্যান্ডআউটে লেখার জন্য যে কোনও কমান্ডের সাথে কাজ করে তা ব্যবহার করা হয় xargs, যা আপনাকে কমান্ডের শেষের সাথে অনেকগুলি কমান্ড-লাইন যুক্তি যুক্ত করতে দেয়:

$ find … | xargs grep 'search'

বা আপনার grepলাইনে কমান্ডটি ব্যাকটিক্স বা এম্বেড করার জন্য $(), যা কমান্ডটি চালাবে এবং এর আউটপুটটি প্রতিস্থাপন করবে:

$ grep 'search' $(find …)

নোট করুন যে ফাইলের নামগুলিতে শ্বেত স্পেস বা কিছু অন্যান্য "অদ্ভুত অক্ষর" রয়েছে ( \'"xargs এর \[*?জন্য $(find …)) যদি এই আদেশগুলি কাজ করে না ।


তবে findপ্রদত্ত যুক্তিগুলিতে কোনও প্রোগ্রাম চালানোর দক্ষতার নির্দিষ্ট ক্ষেত্রে অন্তর্নির্মিত:

$ find … -exec grep 'search' {} \;

এর মধ্যে -execএবং এর মধ্যেকার সমস্ত ;কিছুই হ'ল আদেশ কার্যকর করতে; {}দ্বারা পাওয়া ফাইলের নাম দ্বারা প্রতিস্থাপিত হয় find। এটি grepপ্রতিটি ফাইলের জন্য পৃথক সম্পাদন করবে ; যেহেতু grepঅনেকগুলি ফাইলের নাম নিতে পারে এবং সেগুলি সন্ধান করতে পারে, তাই আপনি সমস্ত মিলে যাওয়া ফাইলের নাম একবারে পাস ;করার +জন্য এটি অনুসন্ধান করতে পারেন grep:

$ find … -exec grep 'search' {} \+

1
লক্ষ করা উচিত যে প্রথম দুটি ফর্ম ফাঁকা ফাইল ফাইলের সাথে কাজ করে না।
enzotib

1
আমি পছন্দ find ... -type f -print0 | xargs -r0 grep 'search' /dev/null। Qed। যদিও -exec +খুব দক্ষ, এটি অনুসন্ধানের সমস্ত সংস্করণে বিদ্যমান নেই।
আর্জেজ

দুঃখের বিষয় আমি আপনাকে 3 বার সঠিকভাবে পরীক্ষা করতে পারছি না।
আর্কাবার্ড

3
আমি -execবরং ব্যবহার করার পরামর্শ দিই xargs। আপনি ব্যবহার করেন তাহলে -execfind, এটি শুধুমাত্র একটি শেল তৈরি করবে grep বিষয়বস্তুর জন্য। আপনি যদি এটি ব্যবহার করেন তবে xargsএটি দুটি শাঁস তৈরি করবে: একটির জন্য findএবং অন্যটির জন্য xargs

2
পরীক্ষা দ্বারা আমি দেখি যে $ find … -exec grep 'search' {} \+রূপ অনেক দ্রুততম।
গোগৌড

9

কিছু সংস্করণ grep(যেমন- এম্বেডড লিনাক্স বা বিএসডি বা ম্যাক ওএস এক্স) এর ক্ষেত্রে -rপুনরাবৃত্ত অনুসন্ধান করতে একটি বিকল্প রয়েছে। ওপেনবিএসডি-তে, ব্যবহার করুন -R(এবং --excludeনীচের উদাহরণের মতো নেই)। এটি এর findসাথে সহজ সংমিশ্রণগুলি জুড়ে grep

যদি আপনার বাস্তবায়নে -Rপতাকা না থাকে , বা যদি আপনি ফ্যানসিয়ার ফাইলের মিলের মানদণ্ড চান তবে আপনি এটিকে কার্যকর করার জন্য -execপ্রাথমিকটি ব্যবহার করতে পারেন । কিছু পুরানো বাস্তবায়ন সমর্থন করে না … ; এই সিস্টেমে এর পরিবর্তে একটি ব্যবহার করুন (এটি প্রতি ফাইলের জন্য একবার কল করবে , তাই এটি ধীর হবে তবে অন্যথায় ফলাফলটি একই হবে)। কোনও একক ফাইলে ফোন করা সত্ত্বেও ফাইলটির নামটি দেখানোর কারণটি নোট করুন (জিএনইউ গ্রেপ এবং ফ্রিবিএসডি / নেটবিএসডি / ওএসএক্স গ্রেপ একই প্রভাব অর্জনের জন্য একটি বিকল্প রয়েছে)।findgrepfind-exec+;+grep/dev/nullgrep-H

find . -type f -name '*.o' -prune -o -exec grep 'needle' /dev/null {} +
grep -r --exclude='*.o' 'needle' .

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