কেবলমাত্র প্যাটার্ন সহ ফাইলের নাম অনুসন্ধান করুন এবং ইকো করুন


16

আমি এটি প্রচুর ব্যবহার করেছি, আমি যে উন্নতি অর্জন করতে চাইছি তা হ'ল ইকো ফাইলের নামগুলি এড়ানো যা গ্রেপের সাথে মেলে না। এটি করার ভাল উপায়?

    for file in `find . -name "*.py"`; do echo $file; grep something $file; done

উত্তর:


24
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

(ফ্রিবিএসডি এবং ডেরিভেটিভসেও কাজ করে)।


6

আপনি যদি জিএনইউ গ্রেপ ব্যবহার করছেন তবে আপনি এটির জন্য সহজ বিকল্পটি ব্যবহার করতে পারেন -rবা --recursiveবিকল্পটি ব্যবহার করতে পারেন :

grep -r --include '*.py' -le "$regexp" ./ # for filenames only
grep -r --include '*.py' -He "$regexp" ./ # for filenames on each match

আপনার findআরও প্রয়োজন যদি আপনার আরও উন্নত পূর্বাভাসের প্রয়োজন হয়।


1
জিএনইউর সংস্করণ অনুসারে grep, grepসিমলিংকের ভিতরে বা ডিরেক্টরিতে ট্র্যাভার্স সিমলিঙ্কগুলি দেখতে পারে বা নাও পারে। অন্যান্য ধরণের নিয়মিত ফাইল হ্যান্ডলিংয়ের ক্ষেত্রে আপনি কিছু বৈকল্পিকও খুঁজে পেতে পারেন।
স্টাফেন চেজেলাস

5

আউটপুটে ফাইলের নাম অন্তর্ভুক্ত করতে আপনি গ্রেপকে বলতে পারেন। সুতরাং যদি কোনও মিল থাকে তবে এটি কনসোলে প্রদর্শিত হবে; যদি কোনও ফাইলের মধ্যে কোনও মিল না থাকে তবে সেই ফাইলটির জন্য কোনও লাইন প্রিন্ট করা হবে না।

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

1

আপনি এর মতো কিছু চেষ্টা করতে পারেন:

find . -name "*.py:" -exec grep -l {} \;

ফাইন্ড কমান্ড এবং এর স্ট্যান্ডার্ড ফাইন্ড কমান্ড বৈশিষ্ট্য দ্বারা আবিষ্কার করা প্রতিটি ফাইলের জন্য এই এক্সিকিউট গ্রেপ কমান্ড


1

-lযুক্তি ব্যবহার করুন ।

for file in `find . -name "*.py"`; do grep -l something $file && grep something $file; done

আরও সন্ধানী ব্যবহার হ'ল:

for file in $(find . -name '*.py' -exec grep -l something '{}' +); do echo "$file"; grep something $file; done

1

এমন grepবিকল্প রয়েছে যা ডিফল্টরূপে ফলাফলগুলি আপনি চান সেই ফর্ম্যাটে ফলাফল দেয়। আমার পরিচিত 2 টি সর্বাধিক জনপ্রিয় যা agহ'ল (ওরফে "সিলভার সন্ধানকারী") এবং ackagএর দ্রুত বিকল্প হিসাবে বিজ্ঞাপন দেওয়া হয় 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) {
...

আমি এখানে আপনাকে দেখাতে পারছি না, তবে আউটপুট ঝরঝরে রঙিন। আমি একটি জলপাই সবুজে ফাইলের নামগুলি পেয়েছি, সোনার হলুদে রেখার সংখ্যাগুলি এবং রক্তে লাল রঙের প্রতিটি লাইনে মিলে যাওয়া টুকরা। রঙগুলি যদিও কাস্টমাইজযোগ্য।

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