আমি কীভাবে grep
সমস্ত ডিরেক্টরি এবং উপ-ডিরেক্টরি পুনরাবৃত্ত করতে পারি ?
find . | xargs grep "texthere" *
grep -rin xlsx *.pl
রেডহাট লিনাক্সে আমার পক্ষে কাজ করে না। আমি একটি "কোনও মিল নেই" ত্রুটি পেয়েছি।
আমি কীভাবে grep
সমস্ত ডিরেক্টরি এবং উপ-ডিরেক্টরি পুনরাবৃত্ত করতে পারি ?
find . | xargs grep "texthere" *
grep -rin xlsx *.pl
রেডহাট লিনাক্সে আমার পক্ষে কাজ করে না। আমি একটি "কোনও মিল নেই" ত্রুটি পেয়েছি।
উত্তর:
grep -r "texthere" .
প্রথম প্যারামিটার অনুসন্ধানের জন্য নিয়মিত প্রকাশকে প্রতিনিধিত্ব করে, যখন দ্বিতীয়টি অনুসন্ধান করা উচিত এমন ডিরেক্টরিটি উপস্থাপন করে। এই ক্ষেত্রে, .
বর্তমান ডিরেক্টরি মানে।
দ্রষ্টব্য: এটি জিএনইউ গ্রেপের পক্ষে কাজ করে এবং সোলারিসের মতো কয়েকটি প্ল্যাটফর্মে আপনাকে অবশ্যই বিশেষত জেনু গ্রেপ ব্যবহার করতে হবে যা উত্তরাধিকার বাস্তবায়নের বিরোধিতা করে। সোলারিসের জন্য এটি হ'ল ggrep
আদেশ।
AIX 5.3
উদাহরণস্বরূপ যে গ্রেপটিতে আসে এটি কাজ করে না ।
আপনি যদি চান ফাইলটির প্রসার বা প্যাটার্নটি জানেন তবে অন্য পদ্ধতিটি --include
বিকল্পটি ব্যবহার করতে হবে :
grep -r --include "*.txt" texthere .
বাদ দিয়ে আপনি ফাইলগুলি উল্লেখ করতে পারেন --exclude
।
যদি আপনি ঘন ঘন কোডের মাধ্যমে অনুসন্ধান করেন তবে অ্যাগ্র (দ্য সিলভার সন্ধানকারী) গ্রেপের একটি খুব দ্রুত বিকল্প, এটি অনুসন্ধানের কোডের জন্য কাস্টমাইজড। উদাহরণস্বরূপ, এটি ডিফল্টরূপে পুনরাবৃত্তিযোগ্য এবং স্বয়ংক্রিয়ভাবে তালিকাভুক্ত ফাইল এবং ডিরেক্টরিগুলিকে উপেক্ষা করে .gitignore
, সুতরাং আপনাকে গ্রেপ বা সন্ধান করতে একই জটিল বাকী বিকল্পগুলি অতিক্রম করতে হবে না।
=
উবুন্টুতে ঠিক কাজ করার পরিবর্তে ` । PS: এটিকে ব্যাকটিক স্পেস বলে মনে করা হলেও এসও মার্কডাউন পার্সার ব্যর্থ।
grep
নয়, কেবল তাই আপনি জানেন :)
--include "*.txt" --include "*.TXT"
এছাড়াও:
find ./ -type f -print0 | xargs -0 grep "foo"
তবে grep -r
এটি একটি ভাল উত্তর।
find . -type f -exec grep "foo" '{}' \;
যেখানে সমর্থিত সেখানে ভাল কাজ করে।
find ./ -type f -print0 | xargs -0 grep "foo"
আমি এখন সর্বদা ব্যবহার করি (এমনকি উইন্ডোজে 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;
...
-R
বিকল্পগুলির কারণে পুনরাবৃত্তভাবে ) ফোল্ডারগুলিতে প্রয়োগ করা হয়।
*
বা .
একটি গ্লোব প্যাটার্ন (শেল দ্বারা ব্যাখ্যা করা): unix.stackexchange.com/a/64695/7490 । ' .
' ডটফিল বা ডট ফোল্ডারও নির্বাচন করবে (যেমন .git/
)
grep -rnI
তবে আমি শিখেছি -n
পারফরম্যান্স অনেক কমে যায় তাই আমি যখন প্রয়োজন তখনই এটি ব্যবহার করি এবং সাধারণত আমি ব্যবহার করব-rI
পসিক্স সিস্টেমে আপনি কোনও -r
প্যারামিটার খুঁজে পাবেন না grep
এবং আপনার grep -rn "stuff" .
চলবে না, তবে আপনি যদি find
কমান্ড ব্যবহার করেন তবে এটি হবে:
find . -type f -exec grep -n "stuff" {} \; -print
সম্মত Solaris
এবং HP-UX
।
-exec
বিকল্প - প্রতীক {}
ফাইলের নাম বর্তমানে পাওয়া যা একটি রেফারেন্স find
সরঞ্জাম (ফাইলের নাম আমরা দেখেছি সঙ্গে কিছু করতে যে), এছাড়াও -exec
বিকল্প সমাপ্ত করা উচিত ;
প্রতীক (Exec কম্যান্ডের বিভক্তি চিহ্ন করা), কিন্তু এই সব কারণ একটি শেল চালানো যে প্রতীকটি এড়াতে হবে .. এবং অবশেষে -print
বিকল্পটি find
সরঞ্জামটিকে স্ক্রিনে পাওয়া ফাইলের নামগুলি মুদ্রণ করতে দেয় ।
**
grep -r
কাজগুলি ব্যবহার করে, তবে এটি অত্যধিক কিল হতে পারে, বিশেষত বড় ফোল্ডারে।
আরও ব্যবহারিক ব্যবহারের জন্য, এখানে সিনট্যাক্স যা গ্লোব্বিং সিনট্যাক্স ব্যবহার করে ( **
):
grep "texthere" **/*.txt
যা প্যাটার্ন নির্বাচিত প্যাটার্ন সহ কেবলমাত্র নির্দিষ্ট ফাইলগুলিকে গ্রেপ করে। এটি সমর্থিত শেল যেমন বাশ +4 বা zsh এর জন্য কাজ করে ।
এই বৈশিষ্ট্যটি সক্রিয় করতে, সঞ্চালন করুন: shopt -s globstar
।
আরও দেখুন: লিনাক্সে সুনির্দিষ্ট পাঠ্যযুক্ত সমস্ত ফাইল কীভাবে খুঁজে পাব?
git grep
গিট সংস্করণ নিয়ন্ত্রণাধীন প্রকল্পগুলির জন্য, ব্যবহার করুন:
git grep "pattern"
যা অনেক তাড়াতাড়ি।
ripgrep
বৃহত্তর প্রকল্পগুলির জন্য, দ্রুত গ্রেপিং সরঞ্জামটি হ'ল ripgrep
ডিফল্টরূপে পুনরাবৃত্তভাবে ফাইলগুলি গ্রেপ করে:
rg "pattern" .
এটি রাস্টের রেজেক্স ইঞ্জিনের শীর্ষে নির্মিত যা সীমাবদ্ধ অটোমেটা, সিমডি এবং আক্রমণাত্মক আক্ষরিক অনুকূলকরণের সাহায্যে অনুসন্ধানটি খুব দ্রুত করে তোলে। এখানে বিশদ বিশ্লেষণ পরীক্ষা করুন ।
নীচে কমান্ডের নীচে নির্দিষ্ট ব্যবহারের files
সাথে path
পুনরাবৃত্তির সাথে নাম জানতে :string
UNIX
find . | xargs grep "searched-string"
জন্য Linux
:
grep -r "searched-string" .
UNIX
সার্ভারে একটি ফাইল সন্ধান করুন
find . -type f -name file_name
লিনাক্স সার্ভারে একটি ফাইল সন্ধান করুন
find . -name file_name
যদি আপনি কেবল প্রকৃত ডিরেক্টরিগুলি অনুসরণ করতে চান, এবং প্রতীকী লিঙ্কগুলি না,
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/
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
এই কাজ করা উচিত:
grep -R "texthere" *
আপনি যদি কোনও ডিরেক্টরি কাঠামো থেকে সমস্ত ফাইলে একটি নির্দিষ্ট বিষয়বস্তু সন্ধান find
করছেন তবে আপনি যা করছেন তা এটি আরও পরিষ্কার হওয়ার কারণে আপনি ব্যবহার করতে পারেন :
find -type f -exec grep -l "texthere" {} +
দ্রষ্টব্য যে -l
(এল এর ডাউনসেকেস) পাঠ্যযুক্ত ফাইলটির নাম দেখায়। আপনি যদি পরিবর্তে ম্যাচটি মুদ্রণ করতে চান তবে এটি সরান। বা -H
ম্যাচের সাথে ফাইলটি একসাথে পেতে ব্যবহার করুন। সমস্ত একসাথে, অন্যান্য বিকল্পগুলি হ'ল:
find -type f -exec grep -Hn "texthere" {} +
যেখানে -n
লাইন নম্বর প্রিন্ট করে।
find
উভয় এড়ানোর অপ্রয়োজনীয় ব্যবহারের সমাধান xargs
এবং ব্যবহার +
পরিবর্তে \;
সঙ্গে -exec
ফলে অপ্রয়োজনীয় প্রক্রিয়া লঞ্চ টন এড়ানো। :-)
এটিই আমার বর্তমান মেশিনে আমার কেসটির জন্য কাজ করেছে (উইন্ডোজ 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"
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
বিকল্পের সমান ।
$ grep --help
$ grep --help |grep recursive
-r, --recursive like --directories=recurse
-R, --dereference-recursive
ack
( http://beyondgrep.com/ )
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
।
rg
থেকে, স্ক্র্যাচ থেকে একটি পুনরাবৃত্ত গ্রেপ কমান্ড একসাথে cobling উপর যথেষ্ট প্রান্ত আছে। ব্যবহার rg
: rg foo
। UNIX সরঞ্জাম ব্যবহার হচ্ছে: find . | xargs grep foo
। এবং আপনার ফাইলগুলির মধ্যে যদি এর কোনও উদ্ধৃতি থাকে, আপনাকে ব্যবহার করা দরকার find . -print0 | xargs -0 grep foo
। আপনি কি মনে করতে যাচ্ছেন যে আপনি যদি বছরের কয়েকবার এটি ব্যবহার করেন?
find . -type f -exec grep 'regex' {} +
যদি কোনও নিয়মিততা সহ এই সরঞ্জামগুলি ব্যবহার করেন তবে কোনটি অবশ্যই স্মরণ রাখা সহজ forget তবে আপনার যদি ঘন ঘন জিনিসগুলি সন্ধান করতে হয় তবে সম্ভবত আপনার চালানো উচিত ctags
বা etags
আপনার উত্স ট্রিতে।
আমার আইবিএম এআইএক্স সার্ভারে (ওএস সংস্করণ: এআইএক্স 5.2), ব্যবহার করুন:
find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \;
এটি ফাইলের মধ্যে পথ / ফাইলের নাম এবং আপেক্ষিক লাইন নম্বর প্রিন্ট করবে:
./inc/xxxx_x.h
2865: / ** বর্ণনা: স্ট্রিং YouWannaFind * /
যাইহোক, এটি আমার পক্ষে কাজ করে:)
নীচে একটি String
পুনরাবৃত্তি অনুসন্ধান Unix
এবং Linux
পরিবেশের জন্য কমান্ড দেওয়া হয়েছে ।
জন্য UNIX
কমান্ড:
find . -name "string to be searched" -exec grep "text" "{}" \;
জন্য Linux
কমান্ড:
grep -r "string to be searched" .
উপলভ্য পতাকাগুলির তালিকার জন্য:
grep --help
বর্তমান ডিরেক্টরিতে রেজিপ্সেক্স পাঠ্যের জন্য সমস্ত ম্যাচ ফেরত সম্পর্কিত লাইন নম্বর সহ:
grep -rn "texthere" .
সংশ্লিষ্ট লাইন নম্বর এবং উপেক্ষা কেস সহ মূল ডিরেক্টরি থেকে শুরু করে এখানে পাঠ্যের জন্য সমস্ত ম্যাচ ফেরত দেয় :
grep -rni "texthere" /
পতাকা এখানে ব্যবহৃত:
-r
পুনরাবৃত্তি -n
আউটপুট সহ প্রিন্ট লাইন নম্বর -i
অবহেলার ঘটনাআমার ধারণা আপনি এটি লেখার চেষ্টা করছেন
grep myText $(find .)
এবং যদি আপনি ফাইলগুলি গ্রেপ হিট খুঁজতে চান তবে এটি অন্য কোনও সহায়ক হতে পারে
grep myText $(find .) | cut -d : -f 1 | sort | uniq
নোট করুন যে find . -type f | xargs grep whatever
যখন অনেকগুলি ফাইল সন্ধানের সাথে মিলে যায় তখন "আর্গুমেন্টের তালিকা থেকে দীর্ঘতর" ত্রুটিতে চলে আসে orts
সেরা বাজিটি grep -r
কিন্তু তা উপলভ্য না হলে find . -type f -exec grep -H whatever {} \;
পরিবর্তে ব্যবহার করুন।
xargs
বিশেষত "আর্গুমেন্ট তালিকা খুব দীর্ঘ" সমস্যার সমাধানের কাজ work
find . -type f | xargs -L 100 grep whatever
xargs
মানক করা হয়েছে। " xargs
ইউটিলিটি কমান্ড লাইনের দৈর্ঘ্যকে এমনভাবে সীমাবদ্ধ করবে যে কমান্ড লাইনটি চালু করা হলে সম্মিলিত যুক্তি এবং পরিবেশের তালিকা ... {ARG_MAX} -2048 বাইটের বেশি হবে না।"
কেবল মজাদার জন্য, @ chtrangrant উত্তর টাইপ করতে খুব বেশি হলে * .txt ফাইলগুলির একটি দ্রুত এবং মলিন অনুসন্ধান :-)
grep -r texthere .|grep .txt
এখানে একটি পুনরাবৃত্ত (বাশ এবং শ এর সাথে হালকাভাবে পরীক্ষিত) ফাংশন রয়েছে যা প্রদত্ত ফোল্ডারে ($ 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