আমি এটি প্রচুর ব্যবহার করেছি, আমি যে উন্নতি অর্জন করতে চাইছি তা হ'ল ইকো ফাইলের নামগুলি এড়ানো যা গ্রেপের সাথে মেলে না। এটি করার ভাল উপায়?
for file in `find . -name "*.py"`; do echo $file; grep something $file; done
আমি এটি প্রচুর ব্যবহার করেছি, আমি যে উন্নতি অর্জন করতে চাইছি তা হ'ল ইকো ফাইলের নামগুলি এড়ানো যা গ্রেপের সাথে মেলে না। এটি করার ভাল উপায়?
for file in `find . -name "*.py"`; do echo $file; grep something $file; done
উত্তর:
find . -name '*.py' -exec grep something {} \; -print
মিলের লাইনের পরে ফাইলের নাম মুদ্রণ করবে ।
find . -name '*.py' -exec grep something /dev/null {} +
প্রত্যেক ম্যাচিং লাইন সামনে ফাইলের নাম প্রিন্ট হবে (আমরা যোগ /dev/null
যেখানে আছে শুধুমাত্র ক্ষেত্রে জন্য এক ম্যাচিং ফাইল হিসাবে grep
ফাইলের নাম মুদ্রণ না যদি এটা সন্ধান করার জন্য শুধুমাত্র একটি ফাইল পাস হচ্ছে। দ্য গনুহ বাস্তবায়ন grep
টি -H
যে জন্য বিকল্প বিকল্প হিসাবে).
find . -name '*.py' -exec grep -l something {} +
কমপক্ষে একটি মিলে যাওয়া লাইন থাকা ফাইলগুলির কেবলমাত্র ফাইলের নাম মুদ্রণ করবে।
মিলের লাইনের আগে ফাইলের নাম মুদ্রণ করতে , আপনি এর পরিবর্তে awk ব্যবহার করতে পারেন:
find . -name '*.py' -exec awk '
FNR == 1 {filename_printed = 0}
/something/ {
if (!filename_printed) {
print FILENAME
filename_printed = 1
}
print
}' {} +
অথবা grep
প্রতিটি ফাইলের জন্য দু'বার কল করুন - যদিও এটি কম দক্ষ হবে কারণ এটি কমপক্ষে একটি grep
কমান্ড চালাবে এবং প্রতিটি ফাইলের জন্য দু'জন পর্যন্ত (এবং ফাইলটির বিষয়বস্তু দু'বার পড়ুন):
find . -name '*.py' -exec grep -l something {} \; \
-exec grep something {} \;
যাই হোক না কেনfind
, আপনি এর মতো আউটপুটটি লুপ করতে চান না এবং আপনার ভেরিয়েবলগুলি উদ্ধৃত করতে ভুলবেন না ।
আপনি যদি জিএনইউ সরঞ্জাম সহ শেল লুপ ব্যবহার করতে চান:
find . -name '*.py' -exec grep -l --null something {} + |
xargs -r0 sh -c '
for file do
printf "%s\n" "$file"
grep something < "$file"
done' sh
(ফ্রিবিএসডি এবং ডেরিভেটিভসেও কাজ করে)।
আপনি যদি জিএনইউ গ্রেপ ব্যবহার করছেন তবে আপনি এটির জন্য সহজ বিকল্পটি ব্যবহার করতে পারেন -r
বা --recursive
বিকল্পটি ব্যবহার করতে পারেন :
grep -r --include '*.py' -le "$regexp" ./ # for filenames only
grep -r --include '*.py' -He "$regexp" ./ # for filenames on each match
আপনার find
আরও প্রয়োজন যদি আপনার আরও উন্নত পূর্বাভাসের প্রয়োজন হয়।
grep
, grep
সিমলিংকের ভিতরে বা ডিরেক্টরিতে ট্র্যাভার্স সিমলিঙ্কগুলি দেখতে পারে বা নাও পারে। অন্যান্য ধরণের নিয়মিত ফাইল হ্যান্ডলিংয়ের ক্ষেত্রে আপনি কিছু বৈকল্পিকও খুঁজে পেতে পারেন।
আউটপুটে ফাইলের নাম অন্তর্ভুক্ত করতে আপনি গ্রেপকে বলতে পারেন। সুতরাং যদি কোনও মিল থাকে তবে এটি কনসোলে প্রদর্শিত হবে; যদি কোনও ফাইলের মধ্যে কোনও মিল না থাকে তবে সেই ফাইলটির জন্য কোনও লাইন প্রিন্ট করা হবে না।
find . -name "*.py" | xargs grep -n -H something
থেকে man grep
:
-H Always print filename headers with output lines
-n, --line-number
Each output line is preceded by its relative line number in the file, starting at line 1. The line number counter is reset for each file processed.
This option is ignored if -c, -L, -l, or -q is specified.
আপনার ফাইলগুলির মধ্যে ফাঁকা জায়গাগুলির সাথে নাম থাকতে পারে, আপনাকে সেপারেটর হিসাবে NUL অক্ষর ব্যবহার করতে পাইপটি স্যুইচ করতে হবে। সম্পূর্ণ কমান্ডটি এখন এর মতো দেখবে:
find . -name "*.py" -print0 | xargs -0 grep -n -H something
আপনি এর মতো কিছু চেষ্টা করতে পারেন:
find . -name "*.py:" -exec grep -l {} \;
ফাইন্ড কমান্ড এবং এর স্ট্যান্ডার্ড ফাইন্ড কমান্ড বৈশিষ্ট্য দ্বারা আবিষ্কার করা প্রতিটি ফাইলের জন্য এই এক্সিকিউট গ্রেপ কমান্ড
এমন grep
বিকল্প রয়েছে যা ডিফল্টরূপে ফলাফলগুলি আপনি চান সেই ফর্ম্যাটে ফলাফল দেয়। আমার পরিচিত 2 টি সর্বাধিক জনপ্রিয় যা ag
হ'ল (ওরফে "সিলভার সন্ধানকারী") এবং ack
। ag
এর দ্রুত বিকল্প হিসাবে বিজ্ঞাপন দেওয়া হয় ack
।
$ ag '^\w+\s*\w+\(' ~/build/i3/src
build/i3/src/display_version.c
58:void display_running_version(void) {
build/i3/src/load_layout.c
42:static TAILQ_HEAD(focus_mappings_head, focus_mapping) focus_mappings =
518:json_content_t json_determine_content(const char *filename) {
575:void tree_append_json(Con *con, const char *filename, char **errormsg) {
build/i3/src/x.c
64:CIRCLEQ_HEAD(state_head, con_state) state_head =
67:CIRCLEQ_HEAD(old_state_head, con_state) old_state_head =
70:TAILQ_HEAD(initial_mapping_head, con_state) initial_mapping_head =
97:void x_con_init(Con *con, uint16_t depth) {
...
আমি এখানে আপনাকে দেখাতে পারছি না, তবে আউটপুট ঝরঝরে রঙিন। আমি একটি জলপাই সবুজে ফাইলের নামগুলি পেয়েছি, সোনার হলুদে রেখার সংখ্যাগুলি এবং রক্তে লাল রঙের প্রতিটি লাইনে মিলে যাওয়া টুকরা। রঙগুলি যদিও কাস্টমাইজযোগ্য।