একটি ডিরেক্টরি অধীনে সমস্ত ফাইল গ্রেপ করার সহজ উপায় আছে?


21

যখন আমি কিছু সামগ্রীর জন্য একটি সম্পূর্ণ গাছ অনুসন্ধান করতে চাই, আমি ব্যবহার করি

find . -type f -print0 | xargs -0 grep <search_string>

পারফরম্যান্স বা ব্রেভিটির ক্ষেত্রে এটি করার আরও ভাল উপায় কী?


2
@ ডাউনভোটার: আপনি যদি নিজের উদ্বেগগুলি ভাগ করে নিতে পারেন তবে এই প্রশ্নের উন্নতি করতে পেরে খুশি।
ড্যানক্রাম্ব

2
অনেকগুলি সংস্করণে xargs অন্তর্নির্মিত রয়েছে: সন্ধান করুন। -প্রকার F -exec fgrep <search_string> {} +
সিম্পুসার

উত্তর:


42

আপনার grepসমর্থন -rবিকল্প ( পুনরাবৃত্তি জন্য ) পরীক্ষা করুন:

grep -r <search_string> .

1
হ্যাঁ ... আমি সবেমাত্র স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি/ 16956810/ … পেয়েছি এবং এটিও সেখানে উত্তর।
ড্যানক্রম্ব

--exclude-dirসম্পাদনা সম্পাদনা সম্পর্কে একটি মন্তব্য যুক্ত করুন এবং আমাদের একটি বিজয়ী আছে!
ড্যানক্রাম্ব

1
কেবল লক্ষ্য করুন যে এটি বহনযোগ্য নয়, তবে grepসাম্প্রতিক ফ্রিবিএসডি এবং লিনাক্স এটিকে সমর্থন করে। আর কেন --exclude-dir? আপনি পুরো গাছটি অনুসন্ধান করতে বলেননি ?
ফিলিপস

ফেয়ার পয়েন্ট ... --exclude-dirআসলে আমার ব্যবহারের ক্ষেত্রে কার্যকর (কারণ সাবট্রির অংশগুলি বড়, তবে অকেজো) এবং আমি অভিনয় সম্পর্কে জিজ্ঞাসা করেছি ... তবে আপনি ঠিক বলেছেন, এটি প্রয়োজনীয় নয়।
ড্যানক্রাম্ব

এই ক্ষেত্রে আমাকে যুক্ত করতে হবে আইআইআরসি জিএনইউয়ের --exclude-dirসাথে একচেটিয়া grep। (-:
ফিলিপোস

13

একটি সাব অনুকূল উত্তর: আউটপুট বংশীধ্বনিতুল্য পরিবর্তে findমধ্যে grep, আপনি শুধু চালাতে পারে

find . -type f -exec grep 'research' {} '+'

এবং ভয়েলা, দু'জনের পরিবর্তে এক আদেশ!

ব্যাখ্যা:

find . -type f

এর মধ্যে সমস্ত নিয়মিত ফাইল সন্ধান করুন।

-exec grep 'research'

গ্রেপ 'গবেষণা'

{}

পাওয়া ফাইলের নাম

'+'

সমস্ত ফাইল নাম অনুসারে একটি কমান্ড ব্যবহার করুন, একবার ফাইলের নাম হিসাবে নয়।

নোট: ';'এটির সাথে ফাইল নাম অনুসারে একবার হত।

আপনি যদি সোর্স কোড প্রসেস করতে এটি ব্যবহার করেন তবে আপনি ackকোড বিটগুলি সহজেই সন্ধান করার জন্য তৈরি করা যেতে পারে।

ACK

সম্পাদনা করুন:

আপনি এই গবেষণাটি আরও বাড়িয়ে নিতে পারেন। প্রথমে, আপনি নির্দিষ্ট নামকরণের ধরণ সহ ফাইলগুলি সন্ধান করার জন্য -name ''স্যুইচটি ব্যবহার করতে পারেন find

এই ক্ষেত্রে :

  • শুধুমাত্র লগগুলির সাথে সম্পর্কিত ফাইলগুলি: -name '*.log'

  • কেবলমাত্র সি ফাইলগুলি যা সি শিরোনামগুলির সাথে সম্পর্কিত, তবে আপনি নিজের ফাইলের নাম এক্সটেনশনের জন্য বড় হাতের বা ছোট হাতের সাথে আটকে রাখতে পারবেন না: -iname *.c

নোট: পছন্দ করুন grepএবং ack, -iস্যুইচ মানে এই ক্ষেত্রে ক্ষেত্রে সংবেদনশীল।

সেক্ষেত্রে গ্রেপ বর্ণ ছাড়াই এবং লাইন নম্বর ছাড়াই প্রদর্শিত হবে।

আপনি এটি --colorএবং -nস্যুইচ (ফাইলগুলিতে যথাক্রমে রঙ এবং রেখার সংখ্যা) দিয়ে এটি পরিবর্তন করতে পারেন ।

শেষ পর্যন্ত, আপনার মতো কিছু থাকতে পারে:

find . -name '*.log' -type f -exec grep --color -n 'pattern' {} '+'

এই ক্ষেত্রে

$ find . -name '*.c' -type f -exec grep -n 'hello' {} '+' 
./test2/target.c:1:hello

5
ackমহান, এবং একটি দ্রুত সংস্করণ ackহয় ag(রৌপ্য অন্বেষী, geoff.greer.fm/ag )
cfeduke

1
আমি -name '*.log'এটি ফিল্টার দিয়ে পছন্দ করি যেমন এটি দ্রুত।
sdkks 16'17

@cfeduke আমি এটি চেষ্টা করে দেখিনি, বেশিরভাগ কারণ এগ্রি ডাব্লুএসএল-এ ডিফল্ট অ্যাপ্ট্রি স্টোরগুলির অংশ না (আপনি যা পেয়েছেন তা নিয়ে কাজ করতে হবে!)
পিয়েরে-এন্টোইন

একটি কৌশল হ'ল ফাইলের নামটি উপস্থিত হওয়ার জন্য গ্রেপটিতে / dev / নাল যুক্ত করা।
চককট্রিল

একটি কৌশলটি কেবল ডিরেক্টরিগুলি অনুসন্ধান করতে হয় এবং তারপরে ডিরেক্টরি অনুসারে একক কাঁটা / এক্সিকিউট দিয়ে সমস্ত ফাইল পেতে এক্সেক্স গ্রেপ / ডেভ / নাল {} / *।
চককট্রিল

12

আপনি যদি সাব-ডিরেক্টরিতে পুনরাবৃত্তি করতে চান:

grep -R 'pattern' .

-Rবিকল্প একটি প্রমিত বিকল্প নয়, কিন্তু সবচেয়ে সাধারণ দ্বারা সমর্থিত grepবাস্তবায়নের।


7
জিএনইউ -r-R
গ্রেপ

1
@ AFSHIN আপনি কেন প্রতিলিঙ্ক অনুসরণ করতে চান না?
কুসালানন্দ

4
@ কুসালানন্দ পুনরাবৃত্তি? যদিও বর্তমান জিএনইউ grepবাস্তবায়নগুলি পুনরাবৃত্তিগুলি ধরে, আমি মনে করি। অন্যথায় এটি "গাছ" বলতে কী বোঝায় তার উপর নির্ভর করে।
ফিলিপস

2
ফিলিপোস আইএমএইচও, ব্যবহারকারীকে বাচ্চা দেওয়া কোনও সরঞ্জামের মতো করা grepউচিত নয়। ব্যবহারকারীর যদি তাদের ডিরেক্টরি কাঠামোতে প্রতীকী লিঙ্ক লুপ থাকে তবে ভাল, এটি ব্যবহারকারীর সমস্যা :-)
কুসালানন্দ

3
@ কুসালানন্দ এবং যদি সিস্টেমটি লুপ সরবরাহ করে? কখনও হারিয়ে গিয়েছে /sys/devices/cpu/subsystem/devices/cpu/subsystem/devices/cpu/...(টুলস মত -XI আমাকে (কোলাহল যদি না তারা অদ্ভুত যাদু প্রদান তাদের "এআই") কল (-;।
Philippos

5

উপরে উল্লিখিত হিসাবে -rবা -R(কাঙ্ক্ষিত সিমলিংক হ্যান্ডলিংয়ের উপর নির্ভর করে) একটি দ্রুত বিকল্প।

তবে -d <action>সময়ে সময়ে দরকারী হতে পারে।

দুর্দান্ত জিনিসটি -dহ'ল স্কিপ কমান্ড, যখন আপনি কেবলমাত্র বর্তমান স্তরটি স্ক্যান করতে চান "গ্রেপ: ডিরেক্টরি_নাম: একটি ডিরেক্টরি"।

$ grep foo * 
grep: q2: Is a directory 
grep: rt: Is a directory 

$ grep -d skip foo *  
$ 

এবং অবশ্যই:

$ grep -d recurse foo * 
(list of results that don't exist because the word foo isn't in our source code
and I wouldn't publish it anyway).  
$ 

-d skipবিকল্প অন্য স্ক্রিপ্ট ভিতরে সত্যিই সুবিধাজনক যাতে আপনাকে কোনো না 2> /dev/null। :)


0

আপনি যদি অনেকগুলি ফাইলের সাথে কাজ করে থাকেন তবে সাবফোল্ডারগুলিতে সমস্ত ফাইল গ্রেপ না করে অনুসন্ধানের জন্য প্রয়োজনীয় ফাইলগুলি ছাঁটাই করে ফেললে গ্রেপ দ্রুত চলে।

আমি কখনও কখনও এই ফর্ম্যাটটি ব্যবহার করি:

grep "primary" `find . | grep cpp$`

এর .শেষের সাবফোল্ডারে সমস্ত ফাইল সন্ধান করুনcpp । তারপরে "প্রাথমিক" ফাইলগুলির জন্য গ্রেপ করুন।

আপনি যদি চান তবে আপনি সেই ফলাফলগুলি আরও গ্রেপ কলগুলিতে পাইপ করতে পারেন:

grep "primary" `find . | grep cpp$` | grep -v "ignoreThis" | grep -i "caseInsensitiveGrep"

1
ব্যাকটিক্সগুলি আধুনিক আধুনিক অনুশীলন নয়, এগুলি সবই অপ্রচলিত
ক্রিস্টোফার

1
যদি আপনার নামে বিশেষ অক্ষরযুক্ত ফাইল থাকে তবে এটি ভেঙে যাবে। আমি জানি না যে এগুলি যেমন রয়েছে তেমন কাজ করার জন্য তাদের বিশেষ হতে কতটা বিশেষ হতে হবে তবে আপনি যা করছেন তা আসলে ls এর আউটপুটকে বিশ্লেষণ করার মতো একই জিনিস, এটিও খারাপ।
একটি সিভিএন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.