আমি কীভাবে পুনরাবৃত্তভাবে গ্রেপ করব?


1682

আমি কীভাবে grepসমস্ত ডিরেক্টরি এবং উপ-ডিরেক্টরি পুনরাবৃত্ত করতে পারি ?

find . | xargs grep "texthere" *

110
@ টিসি 1 দুঃখজনক বিষয় হ'ল গ্রেপ নিজেই প্রশ্নের উত্তর দিতে পারে (কমপক্ষে জিএনইউ গ্রেপ): গ্রেপ - হেল্প | গ্রেপ পুনরাবৃত্ত
ফ্রাঙ্ক শিমিট

7
আপনি যদি নিজেকে পুনরাবৃত্তি অনুসন্ধান করতে ঘন ঘন গ্রেপ ব্যবহার করে দেখতে পান (বিশেষত আপনি যদি ম্যানুয়ালি ফাইল / ডিরেক্টরি বহির্ভূত প্রচুর পরিমাণে করেন) তবে আপনি অ্যাক (একটি খুব প্রোগ্রামার-বান্ধব গ্রেপ বিকল্প) দরকারী খুঁজে পেতে পারেন।
নিক ম্যাকুর্গি

19
আসলে -আর না - - কর্মক্ষেত্রে আমি যে সোলারিস বাক্সটি ব্যবহার করি তাতে কাজ করা হয় না। এবং গ্রেপের জন্য ম্যান পেজটিতে পুনরাবৃত্তির কিছু উল্লেখ করা হয়নি। আমাকে খুঁজে বের করতে এবং নিজেকে xargs নিতে অবলম্বন করতে হয়েছিল।
বেন

8
এজি এখন এটি করার আমার প্রিয় উপায় github.com/ggreer/the_silver_searcher
dranxo

1
grep -rin xlsx *.plরেডহাট লিনাক্সে আমার পক্ষে কাজ করে না। আমি একটি "কোনও মিল নেই" ত্রুটি পেয়েছি।
বেলারুশ

উত্তর:


2507
grep -r "texthere" .

প্রথম প্যারামিটার অনুসন্ধানের জন্য নিয়মিত প্রকাশকে প্রতিনিধিত্ব করে, যখন দ্বিতীয়টি অনুসন্ধান করা উচিত এমন ডিরেক্টরিটি উপস্থাপন করে। এই ক্ষেত্রে, .বর্তমান ডিরেক্টরি মানে।

দ্রষ্টব্য: এটি জিএনইউ গ্রেপের পক্ষে কাজ করে এবং সোলারিসের মতো কয়েকটি প্ল্যাটফর্মে আপনাকে অবশ্যই বিশেষত জেনু গ্রেপ ব্যবহার করতে হবে যা উত্তরাধিকার বাস্তবায়নের বিরোধিতা করে। সোলারিসের জন্য এটি হ'ল ggrepআদেশ।


39
দ্রষ্টব্য: "গ্রেপ-আর" কেবলমাত্র নতুন গ্রেপগুলিতে কাজ করে। AIX 5.3উদাহরণস্বরূপ যে গ্রেপটিতে আসে এটি কাজ করে না ।
পেছনে টেনে

110
সিমলিঙ্কগুলি অনুসরণ করতে গ্রেপ -আর ব্যবহার করুন।
এলওফ

53
এটা জেনে রাখা ভাল যে "-i" এটিকে কে সংবেদনশীল করে তুলবে, এবং "-n" প্রতিটি মিলিত ফলাফলের জন্য লাইন নম্বরও অন্তর্ভুক্ত করবে।
সাদেঘ

24
এটিও জেনে রাখা ভাল, যদি আপনি কেবল একটি স্থির স্ট্রিং খুঁজছেন এবং কোনও রেজেক্স না, -F বিকল্পটি ব্যবহার করুন। এটি রেগেক্স পার্সারকে না ডেকে আপনার অনেক সময় সাশ্রয় করবে। খুব সহজ যদি আপনি প্রচুর ফাইল অনুসন্ধান করছেন।
জেফ

6
ওরফে আরগ্রেপ = 'গ্রেপ -আর'
টোটেন

679

আপনি যদি চান ফাইলটির প্রসার বা প্যাটার্নটি জানেন তবে অন্য পদ্ধতিটি --includeবিকল্পটি ব্যবহার করতে হবে :

grep -r --include "*.txt" texthere .

বাদ দিয়ে আপনি ফাইলগুলি উল্লেখ করতে পারেন --exclude

এজি

যদি আপনি ঘন ঘন কোডের মাধ্যমে অনুসন্ধান করেন তবে অ্যাগ্র (দ্য সিলভার সন্ধানকারী) গ্রেপের একটি খুব দ্রুত বিকল্প, এটি অনুসন্ধানের কোডের জন্য কাস্টমাইজড। উদাহরণস্বরূপ, এটি ডিফল্টরূপে পুনরাবৃত্তিযোগ্য এবং স্বয়ংক্রিয়ভাবে তালিকাভুক্ত ফাইল এবং ডিরেক্টরিগুলিকে উপেক্ষা করে .gitignore, সুতরাং আপনাকে গ্রেপ বা সন্ধান করতে একই জটিল বাকী বিকল্পগুলি অতিক্রম করতে হবে না।


3
লিনাক্স এবং সাইগউইনের সাথে আসা গ্রেপ দিয়ে দুর্দান্ত কাজ করে, তবে এআইএক্সের সাথে আসে না।
পেছনে টেনে

1
@ ক্রিজিসটফলওয়ানি: =উবুন্টুতে ঠিক কাজ করার পরিবর্তে ` । PS: এটিকে ব্যাকটিক স্পেস বলে মনে করা হলেও এসও মার্কডাউন পার্সার ব্যর্থ।
ড্যান ড্যাসক্লেস্কু

4
@ ড্যানডাসকলেসকু আমি এগ্রির জন্য grepনয়, কেবল তাই আপনি জানেন :)
বার্নহার্ড

1
পুনরাবৃত্তভাবে অনুসন্ধান করার সময় আমাদের কাছে কোনও ডিরেক্টরি বাদ দেওয়ার বিকল্প রয়েছে?
টম টেলর

উইন্ডোজ সাইগউইন ডাবল-কোট পছন্দ করেন--include "*.txt" --include "*.TXT"
বব স্টেইন

127

এছাড়াও:

find ./ -type f -print0 | xargs -0 grep "foo"

তবে grep -rএটি একটি ভাল উত্তর।


14
অথবা আপনি যদি ফাইলনামগুলির ফাঁকা জায়গাগুলির বিষয়ে চিন্তা করতে না চান তবে find . -type f -exec grep "foo" '{}' \;যেখানে সমর্থিত সেখানে ভাল কাজ করে।
এড স্টিল

4
আপনি যদি xargs এর মাধ্যমে গ্রেপ-তে পাইপ সন্ধান করতে চলেছেন এবং আপনি যদি কেবল স্থির স্ট্রিং (যেমন, কোনও রেজেক্স না) সন্ধান করছেন তবে আপনি গ্রেপ-এফ বিকল্পটি ব্যবহার করে উপকৃত হতে পারেন, তাই গ্রেপ রেজেজ ইঞ্জিন লোড করবে না প্রতিটি প্রার্থনার জন্য। যদি প্রচুর ফাইল থাকে তবে এটি আরও দ্রুত হবে।
জেফ

2
অনুসন্ধান . -প্রকার এফ-এক্সেক গ্রেপ -হু "ফু" {} \; এটি ফাইলের নাম হিসাবে আমি ব্যবহার করি।
ওয়েজ

এটি সমস্ত *
নিক্সে

1
find ./ -type f -print0 | xargs -0 grep "foo"
এহেলকে

118

আমি এখন সর্বদা ব্যবহার করি (এমনকি উইন্ডোজে GoW - উইন্ডোতে Gnu সহ ):

grep --include="*.xxx" -nRHI "my Text to grep" *

এর মধ্যে নিম্নলিখিত বিকল্পগুলি অন্তর্ভুক্ত রয়েছে:

--include=PATTERN

ডিরেক্টরি অনুসন্ধানে কেবল ফাইলের সাথে মিল রয়েছে PATTERN

-n, --line-number

আউটপুট প্রতিটি লাইন তার ইনপুট ফাইলের মধ্যে লাইন নম্বর সঙ্গে উপসর্গ।

(দ্রষ্টব্য: phuclv যোগ মন্তব্য যে -nকর্মক্ষমতা অনেক কমে যায় তাই , তাই আপনি যে বিকল্প এড়িয়ে যেতে চান পারে)

-R, -r, --recursive

প্রতিটি ডিরেক্টরিতে সমস্ত ফাইল পড়ুন, পুনরাবৃত্তভাবে; এটি -d recurseবিকল্পের সমতুল্য ।

-H, --with-filename

প্রতিটি ম্যাচের জন্য ফাইলের নাম মুদ্রণ করুন।

-I     

বাইনারি ফাইলটি এমনভাবে প্রক্রিয়া করুন যেন এতে কোনও মিল নেই ডেটা;
এটি --binary-files=without-matchবিকল্পের সমতুল্য ।

এবং আমি ' i' ( -nRHIi) যুক্ত করতে পারি , যদি আমি কেস-সংবেদনশীল ফলাফল চান।

আমি পেতে পারি:

/home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" *
src/GitList/Application.php:43:            'git.hidden'      => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(),
src/GitList/Provider/GitServiceProvider.php:21:            $options['hidden'] = $app['git.hidden'];
tests/InterfaceTest.php:32:        $options['hidden'] = array(self::$tmpdir . '/hiddenrepo');
vendor/klaussilveira/gitter/lib/Gitter/Client.php:20:    protected $hidden;
vendor/klaussilveira/gitter/lib/Gitter/Client.php:170:     * Get hidden repository list
vendor/klaussilveira/gitter/lib/Gitter/Client.php:176:        return $this->hidden;
...

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

এখানে শেষ চরিত্রের অর্থ কী?
লার্নিপার

2
@ লার্নিপার এটি শেলটি আপনার বর্তমান ডিরেক্টরিতে সমস্ত ফাইল এবং ফোল্ডার নির্বাচন করে তোলে, ফলস্বরূপ গ্রেপগুলি সেই ফাইলগুলিতে প্রয়োগ করা হয় এবং ( -Rবিকল্পগুলির কারণে পুনরাবৃত্তভাবে ) ফোল্ডারগুলিতে প্রয়োগ করা হয়।
ভোনসি

2
@ লার্নিপার নয়ে হুবহু: *বা .একটি গ্লোব প্যাটার্ন (শেল দ্বারা ব্যাখ্যা করা): unix.stackexchange.com/a/64695/7490 । ' .' ডটফিল বা ডট ফোল্ডারও নির্বাচন করবে (যেমন .git/)
ভোনসি

পূর্বে আমি সবসময় ব্যবহার করেছি grep -rnIতবে আমি শিখেছি -nপারফরম্যান্স অনেক কমে যায় তাই আমি যখন প্রয়োজন তখনই এটি ব্যবহার করি এবং সাধারণত আমি ব্যবহার করব-rI
phuclv

25

পসিক্স সিস্টেমে আপনি কোনও -rপ্যারামিটার খুঁজে পাবেন না grepএবং আপনার grep -rn "stuff" .চলবে না, তবে আপনি যদি findকমান্ড ব্যবহার করেন তবে এটি হবে:

find . -type f -exec grep -n "stuff" {} \; -print

সম্মত Solarisএবং HP-UX


মানে কি {} \; -প্রিন্ট যথাক্রমে?
ব্যবহারকারী 1169587

3
ইন -execবিকল্প - প্রতীক {}ফাইলের নাম বর্তমানে পাওয়া যা একটি রেফারেন্স findসরঞ্জাম (ফাইলের নাম আমরা দেখেছি সঙ্গে কিছু করতে যে), এছাড়াও -execবিকল্প সমাপ্ত করা উচিত ;প্রতীক (Exec কম্যান্ডের বিভক্তি চিহ্ন করা), কিন্তু এই সব কারণ একটি শেল চালানো যে প্রতীকটি এড়াতে হবে .. এবং অবশেষে -printবিকল্পটি findসরঞ্জামটিকে স্ক্রিনে পাওয়া ফাইলের নামগুলি মুদ্রণ করতে দেয় ।
দাড়কাক

19

globbing **

grep -rকাজগুলি ব্যবহার করে, তবে এটি অত্যধিক কিল হতে পারে, বিশেষত বড় ফোল্ডারে।

আরও ব্যবহারিক ব্যবহারের জন্য, এখানে সিনট্যাক্স যা গ্লোব্বিং সিনট্যাক্স ব্যবহার করে ( **):

grep "texthere" **/*.txt

যা প্যাটার্ন নির্বাচিত প্যাটার্ন সহ কেবলমাত্র নির্দিষ্ট ফাইলগুলিকে গ্রেপ করে। এটি সমর্থিত শেল যেমন বাশ +4 বা zsh এর জন্য কাজ করে

এই বৈশিষ্ট্যটি সক্রিয় করতে, সঞ্চালন করুন: shopt -s globstar

আরও দেখুন: লিনাক্সে সুনির্দিষ্ট পাঠ্যযুক্ত সমস্ত ফাইল কীভাবে খুঁজে পাব?

git grep

গিট সংস্করণ নিয়ন্ত্রণাধীন প্রকল্পগুলির জন্য, ব্যবহার করুন:

git grep "pattern"

যা অনেক তাড়াতাড়ি।

ripgrep

বৃহত্তর প্রকল্পগুলির জন্য, দ্রুত গ্রেপিং সরঞ্জামটি হ'ল ripgrepডিফল্টরূপে পুনরাবৃত্তভাবে ফাইলগুলি গ্রেপ করে:

rg "pattern" .

এটি রাস্টের রেজেক্স ইঞ্জিনের শীর্ষে নির্মিত যা সীমাবদ্ধ অটোমেটা, সিমডি এবং আক্রমণাত্মক আক্ষরিক অনুকূলকরণের সাহায্যে অনুসন্ধানটি খুব দ্রুত করে তোলে। এখানে বিশদ বিশ্লেষণ পরীক্ষা করুন


3
গিট গ্রেপ পরামর্শের জন্য ধন্যবাদ - এটি খুব দরকারী এবং আমি এটি সম্পর্কে জানতাম না!
বাস্যা

2
রিপগ্রিপ পরামর্শের জন্য ধন্যবাদ। এটা উপায় দ্রুত।
কুল হতে হবে

11

নীচে কমান্ডের নীচে নির্দিষ্ট ব্যবহারের filesসাথে pathপুনরাবৃত্তির সাথে নাম জানতে :stringUNIX

find . | xargs grep "searched-string"

জন্য Linux:

grep -r "searched-string" .

UNIXসার্ভারে একটি ফাইল সন্ধান করুন

find . -type f -name file_name

লিনাক্স সার্ভারে একটি ফাইল সন্ধান করুন

find . -name file_name

11

শুধু ফাইলের নামগুলিও কার্যকর হতে পারে

grep -r -l "foo" .

10

যদি আপনি কেবল প্রকৃত ডিরেক্টরিগুলি অনুসরণ করতে চান, এবং প্রতীকী লিঙ্কগুলি না,

grep -r "thingToBeFound" directory

আপনি যদি প্রকৃত নির্দেশিকাগুলির পাশাপাশি প্রতীকী লিঙ্কগুলি অনুসরণ করতে চান (অসীম পুনরাবৃত্তিতে সতর্ক হন),

grep -R "thing to be found" directory

যেহেতু আপনি পুনরাবৃত্তভাবে গ্রেপ করার চেষ্টা করছেন, নিম্নলিখিত বিকল্পগুলি আপনার পক্ষেও কার্যকর হতে পারে:

-H: outputs the filename with the line

-n: outputs the line number in the file

সুতরাং আপনি যদি বর্তমান ডিরেক্টরি বা কোনও উপ-ডিরেক্টরিতে দার্ট ভ্যাডারযুক্ত সমস্ত ফাইল সন্ধান করতে চান এবং ফাইলের নাম এবং লাইন নম্বর ক্যাপচার করতে চান তবে প্রতীকী লিঙ্কগুলি অনুসরণ করতে পুনরাবৃত্তিটি চান না, আদেশটি হবে

grep -rnH "Darth Vader" .

আপনি যদি ডিরেক্টরিতে বিড়াল শব্দের সমস্ত উল্লেখ জানতে চান

/home/adam/Desktop/TomAndJerry 

এবং আপনি বর্তমানে ডিরেক্টরিতে রয়েছেন

/home/adam/Desktop/WorldDominationPlot

এবং আপনি ফাইলের নামটি ধারণ করতে চান তবে "বিড়াল" স্ট্রিংয়ের কোনও উদাহরণের লাইন সংখ্যা নয়, এবং আপনি পুনরাবৃত্তিটি প্রতীকী লিঙ্কগুলি অনুসরণ করতে চান যদি এটিগুলি পাওয়া যায়, আপনি নিম্নলিখিতগুলির মধ্যে দুটি চালাতে পারেন

grep -RH "cats" ../TomAndJerry                   #relative directory

grep -RH "cats" /home/adam/Desktop/TomAndJerry   #absolute directory

সূত্র:

"গ্রেপ - হেল্প" চলছে

প্রতীকী লিঙ্কগুলির একটি সংক্ষিপ্ত পরিচিতি, যে কেউ এই উত্তরটি পড়ছেন এবং তাদের কাছে আমার উল্লেখ দ্বারা বিভ্রান্ত হয়েছেন: https://www.nixtutor.com/freebsd/ বোঝা- symbolic-links/


দুর্দান্ত উত্তর। অতিরিক্ত স্যুইচ (-আরএনএইচ) খুব সহায়ক, তাই তাদের পরামর্শ দেওয়ার জন্য ধন্যবাদ।
semtex41

8

AG এখন এই কাজ করতে আমার প্রিয় উপায় github.com/ggreer/the_silver_searcher । এটি মূলত অ্যাকের মতো একই জিনিস তবে আরও কয়েকটি অপটিমাইজেশন সহ।

এখানে একটি সংক্ষিপ্ত মানদণ্ড। আমি প্রতিটি পরীক্ষার আগে ক্যাশে সাফ করি (সিএফ /ubuntu/155768/how-do-i-clean-or-disable-the- মেমরি- ক্যাশে )

ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time grep -r "hey ya" .

real    0m9.458s
user    0m0.368s
sys 0m3.788s
ryan@3G08:$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ack-grep "hey ya" .

real    0m6.296s
user    0m0.716s
sys 0m1.056s
ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ag "hey ya" .

real    0m5.641s
user    0m0.356s
sys 0m3.444s
ryan@3G08$ time ag "hey ya" . #test without first clearing cache

real    0m0.154s
user    0m0.224s
sys 0m0.172s


6

আপনি যদি কোনও ডিরেক্টরি কাঠামো থেকে সমস্ত ফাইলে একটি নির্দিষ্ট বিষয়বস্তু সন্ধান findকরছেন তবে আপনি যা করছেন তা এটি আরও পরিষ্কার হওয়ার কারণে আপনি ব্যবহার করতে পারেন :

find -type f -exec grep -l "texthere" {} +

দ্রষ্টব্য যে -l(এল এর ডাউনসেকেস) পাঠ্যযুক্ত ফাইলটির নাম দেখায়। আপনি যদি পরিবর্তে ম্যাচটি মুদ্রণ করতে চান তবে এটি সরান। বা -Hম্যাচের সাথে ফাইলটি একসাথে পেতে ব্যবহার করুন। সমস্ত একসাথে, অন্যান্য বিকল্পগুলি হ'ল:

find -type f -exec grep -Hn "texthere" {} +

যেখানে -nলাইন নম্বর প্রিন্ট করে।


2
শুধুমাত্র হওয়ার জন্য আপ-ভোট findউভয় এড়ানোর অপ্রয়োজনীয় ব্যবহারের সমাধান xargsএবং ব্যবহার +পরিবর্তে \;সঙ্গে -execফলে অপ্রয়োজনীয় প্রক্রিয়া লঞ্চ টন এড়ানো। :-)
শ্যাডোএ্যাঞ্জার

6

এটিই আমার বর্তমান মেশিনে আমার কেসটির জন্য কাজ করেছে (উইন্ডোজ on এ গিট ব্যাশ):

find ./ -type f -iname "*.cs" -print0 | xargs -0 grep "content pattern"

আমি সবসময় ফাঁকা জায়গাগুলির জন্য -প্রিন্ট 0 এবং -0 ভুলে যাই।

সম্পাদনা: আমার পছন্দসই সরঞ্জামটি এখন পরিবর্তে রিপগ্রিপ: https://github.com/BurntSushi/ripgrep/releases । এটি সত্যই দ্রুত এবং এর চেয়ে ভাল ডিফল্ট রয়েছে (ডিফল্টরূপে পুনরাবৃত্ত হওয়ার মতো)। আমার মূল উত্তর হিসাবে একই উদাহরণ কিন্তু রিগ্রগ্রিপ ব্যবহার:rg -g "*.cs" "content pattern"


4

grep -r "texthere" . (শেষে নোটিশ সময়কাল)

(^ণ: https://stackoverflow.com/a/1987928/1438029 )


ব্যাখ্যা:

grep -r "texthere" /(পুনরাবৃত্তভাবে সমস্ত ডিরেক্টরি এবং উপ-ডিরেক্টরিগুলি গ্রেপ করুন)

grep -r "texthere" .( এই ডিরেক্টরিগুলি এবং উপ-ডিরেক্টরিগুলি পুনরাবৃত্তভাবে গ্রেপ করুন )

গ্রেপ পুনরাবৃত্তি

grep [options] PATTERN [FILE...]

[বিকল্প]

-R, -r, --recursive

প্রতিটি ডিরেক্টরিতে সমস্ত ফাইল পুনরাবৃত্তভাবে পড়ুন।

এটি বিকল্প -d recurseবা --directories=recurseবিকল্পের সমান ।

http://linuxcommand.org/man_pages/grep1.html

গ্রেপ সহায়তা

$ grep --help

$ grep --help |grep recursive
  -r, --recursive           like --directories=recurse
  -R, --dereference-recursive

বিকল্প

ack( http://beyondgrep.com/ )

ag( http://github.com/ggreer/t_Silver_searcher )


4

2018 সালে, আপনি ব্যবহার করতে চান ripgrepবা the-silver-searcherকারণ তারা বিকল্পগুলির তুলনায় দ্রুততর।

এখানে 336 প্রথম স্তরের উপ-ডিরেক্টরি সহ একটি ডিরেক্টরি রয়েছে:

% find . -maxdepth 1 -type d | wc -l
     336

% time rg -w aggs -g '*.py'
...
rg -w aggs -g '*.py'  1.24s user 2.23s system 283% cpu 1.222 total

% time ag -w aggs -G '.*py$'
...
ag -w aggs -G '.*py$'  2.71s user 1.55s system 116% cpu 3.651 total

% time find ./ -type f -name '*.py' | xargs grep -w aggs
...
find ./ -type f -name '*.py'  1.34s user 5.68s system 32% cpu 21.329 total
xargs grep -w aggs  6.65s user 0.49s system 32% cpu 22.164 total

ওএসএক্স-এ, এটি ইনস্টল করে ripgrep: brew install ripgrep. এই ইনস্টল silver-searcher: brew install the_silver_searcher


আপনার যদি প্রায়শই এটি করা প্রয়োজন হয় তবে গতি গুরুত্বপূর্ণ, তবে আমাদের বেশিরভাগ ব্যক্তি নিজেকে বছরে কয়েকবার কেবল এটি করে দেখেন। সর্বশেষতম স্পিফি তৃতীয় পক্ষের জুজু টুল ডু যাত্রা ইনস্টল করা অতিমাত্রায় শেষ এবং 1978 সাল থেকে যেগুলি সমাধান খুব বেশি পরিবর্তন হয়নি তা নির্বিশেষে জানা ভাল।
ট্রিপলি

আমি এটি অত্যন্ত অবর্ণনীয় বলে মনে করি যে একজন প্রোগ্রামার প্রতি বছরে কয়েকবার উত্স গাছের পাঠ্যের জন্য অনুসন্ধান করবে। এমনকি ব্যবহারের দৃষ্টিকোণ rgথেকে, স্ক্র্যাচ থেকে একটি পুনরাবৃত্ত গ্রেপ কমান্ড একসাথে cobling উপর যথেষ্ট প্রান্ত আছে। ব্যবহার rg: rg foo। UNIX সরঞ্জাম ব্যবহার হচ্ছে: find . | xargs grep foo। এবং আপনার ফাইলগুলির মধ্যে যদি এর কোনও উদ্ধৃতি থাকে, আপনাকে ব্যবহার করা দরকার find . -print0 | xargs -0 grep foo। আপনি কি মনে করতে যাচ্ছেন যে আপনি যদি বছরের কয়েকবার এটি ব্যবহার করেন?
হুগডব্রাউন

1
আপনি find . -type f -exec grep 'regex' {} +যদি কোনও নিয়মিততা সহ এই সরঞ্জামগুলি ব্যবহার করেন তবে কোনটি অবশ্যই স্মরণ রাখা সহজ forget তবে আপনার যদি ঘন ঘন জিনিসগুলি সন্ধান করতে হয় তবে সম্ভবত আপনার চালানো উচিত ctagsবা etagsআপনার উত্স ট্রিতে।
ট্রিপলি

আমি রিপগ্রিপ ব্যবহার করছি এবং এটি দুর্দান্ত। তবে রূপালী অনুসন্ধানকারী প্রোগ্রামারদের জন্য দুর্দান্ত। +1
ম্যাট

3

আমার আইবিএম এআইএক্স সার্ভারে (ওএস সংস্করণ: এআইএক্স 5.2), ব্যবহার করুন:

find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \; 

এটি ফাইলের মধ্যে পথ / ফাইলের নাম এবং আপেক্ষিক লাইন নম্বর প্রিন্ট করবে:

./inc/xxxx_x.h

2865: / ** বর্ণনা: স্ট্রিং YouWannaFind * /

যাইহোক, এটি আমার পক্ষে কাজ করে:)


3

নীচে একটি Stringপুনরাবৃত্তি অনুসন্ধান Unixএবং Linuxপরিবেশের জন্য কমান্ড দেওয়া হয়েছে ।

জন্য UNIXকমান্ড:

find . -name "string to be searched" -exec grep "text" "{}" \;

জন্য Linuxকমান্ড:

grep -r "string to be searched" .

2

উপলভ্য পতাকাগুলির তালিকার জন্য:

grep --help 

বর্তমান ডিরেক্টরিতে রেজিপ্সেক্স পাঠ্যের জন্য সমস্ত ম্যাচ ফেরত সম্পর্কিত লাইন নম্বর সহ:

grep -rn "texthere" .

সংশ্লিষ্ট লাইন নম্বর এবং উপেক্ষা কেস সহ মূল ডিরেক্টরি থেকে শুরু করে এখানে পাঠ্যের জন্য সমস্ত ম্যাচ ফেরত দেয় :

grep -rni "texthere" /

পতাকা এখানে ব্যবহৃত:

  • -r পুনরাবৃত্তি
  • -n আউটপুট সহ প্রিন্ট লাইন নম্বর
  • -i অবহেলার ঘটনা

1

আমার ধারণা আপনি এটি লেখার চেষ্টা করছেন

grep myText $(find .)

এবং যদি আপনি ফাইলগুলি গ্রেপ হিট খুঁজতে চান তবে এটি অন্য কোনও সহায়ক হতে পারে

grep myText $(find .) | cut -d : -f 1 | sort | uniq

এটি অত্যন্ত স্বজ্ঞাত: উদাহরণস্বরূপ: গ্রেপ-আইসিএসি $ (সন্ধান করুন name নাম "এক্সিকিউশন *। *")
ইউ শেন

1

আমার দুটি সেন্ট এখানে ছুঁড়ছে। অন্যরা ইতিমধ্যে গ্রেপ -আর উল্লিখিত হিসাবে প্রতিটি প্ল্যাটফর্মে কাজ করে না। এটি নির্বাক শোনায় তবে আমি সর্বদা গিট ব্যবহার করি।

git grep "texthere"

ডিরেক্টরিটি মঞ্চস্থ না হলেও, আমি কেবল এটি মঞ্চ করি এবং গিট গ্রেপ ব্যবহার করি।


0

নোট করুন যে find . -type f | xargs grep whateverযখন অনেকগুলি ফাইল সন্ধানের সাথে মিলে যায় তখন "আর্গুমেন্টের তালিকা থেকে দীর্ঘতর" ত্রুটিতে চলে আসে orts

সেরা বাজিটি grep -rকিন্তু তা উপলভ্য না হলে find . -type f -exec grep -H whatever {} \;পরিবর্তে ব্যবহার করুন।


তাই না? xargsবিশেষত "আর্গুমেন্ট তালিকা খুব দীর্ঘ" সমস্যার সমাধানের কাজ work
ট্রিপলি

2
আচ্ছা, না - xargs বিশেষত আর্গুমেন্টের পাইপকে একটি আরগলিস্টে রূপান্তর করার জন্য, তবে হ্যাঁ, এটি সত্য যে আধুনিক xargs যখন -s এবং / অথবা -L ব্যবহার করা হয় তখন একাধিক কমান্ডের অনুরোধগুলিকে ভেঙে খুব দীর্ঘ আরগলিস্টগুলি মোকাবেলা করতে পারে, তবে এটি ডিফল্টরূপে সেভাবে কনফিগার করা হয়নি (এবং উপরের প্রতিক্রিয়াগুলির মধ্যে কোনওটি ছিল না)। উদাহরণ হিসাবে:find . -type f | xargs -L 100 grep whatever
মিঃ আজম

কোন প্ল্যাটফর্মটি চালু থাকবে? এই আচরণটি বক্সের বাইরে রাখার জন্য পসিক্সxargs মানক করা হয়েছে। " xargsইউটিলিটি কমান্ড লাইনের দৈর্ঘ্যকে এমনভাবে সীমাবদ্ধ করবে যে কমান্ড লাইনটি চালু করা হলে সম্মিলিত যুক্তি এবং পরিবেশের তালিকা ... {ARG_MAX} -2048 বাইটের বেশি হবে না।"
ট্রিপলি

হুঁ। যদিও এই ভিত্তিতে পিনিক্সের তুলনায় gnu ডকস কম স্পষ্ট, এবং আমার কাছে এই বিবৃতি দেওয়ার কারণী মেশিনে আমার আর অ্যাক্সেস নেই, আমি বর্তমান বাস্তবায়নের বিষয়ে আমার মূল ব্যাখ্যাটি নিশ্চিত করতে পারি না। রিকার্সিভ গ্রেপ অবশ্যই পাওয়া যায় তবে এটি এখনও পছন্দনীয় তবে xargs রেসিপি এড়ানোর খুব কম কারণ নেই (যদিও গ্রেপের চূড়ান্ত অনুরোধটি এড়াতে গ্রেপের জন্য -H ব্যবহার করুন, যদিও শুধুমাত্র একটি ফাইল ফাইল পাস করা হবে)।
মিঃ আজম

0

কেবল মজাদার জন্য, @ chtrangrant উত্তর টাইপ করতে খুব বেশি হলে * .txt ফাইলগুলির একটি দ্রুত এবং মলিন অনুসন্ধান :-)

grep -r texthere .|grep .txt


0

এখানে একটি পুনরাবৃত্ত (বাশ এবং শ এর সাথে হালকাভাবে পরীক্ষিত) ফাংশন রয়েছে যা প্রদত্ত ফোল্ডারে ($ 1) সমস্ত সাবফোল্ডারকে অনুসরণ করে grepএবং প্রদত্ত ফাইলগুলিতে ($ 2) প্রদত্ত স্ট্রিংয়ের জন্য অনুসন্ধান ($ 2) ব্যবহার করে:

$ cat script.sh
#!/bin/sh

cd "$1"

loop () {
    for i in *
    do
        if [ -d "$i" ]
        then
            # echo entering "$i"
            cd "$i"
            loop "$1" "$2"
        fi
    done

    if [ -f "$1" ]
    then
        grep -l "$2" "$PWD/$1"
    fi

    cd ..
}

loop "$2" "$3"

এটি চালানো এবং একটি উদাহরণ আউটপুট:

$ sh script start_folder filename search_string
/home/james/start_folder/dir2/filename

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