বাশ: ফাইলের ডিরেক্টরিতে কোনও স্ট্রিং সন্ধান করার কোনও উপায় আছে কি? [প্রতিলিপি]


47

সম্ভাব্য সদৃশ:
লিনাক্সে একটি টেক্সট প্যাটার্ন জন্য অনুসন্ধান করুন

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

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

উত্তর:


64

সাথে grep:

grep -R "toUppercase()" *

অথবা, যদি আপনি এসি-গ্রেপ ইনস্টল করেন তবে কেবল:

ack-grep "toUppercase"

আপনি যদি সি ফাইলগুলিতে অনুসন্ধান সীমাবদ্ধ করতে চান তবে ack-grep:

ack-grep -cc "toUppercase()"

ack-grepওএসএক্সেও ইনস্টল করা যেতে পারে তবে এক্সিকিউটেবলকে জাস্ট বলা হয় ack


এতটাই যে এসও এরই মধ্যে সন্দেহজনকভাবে অনুরূপ প্রশ্ন রয়েছে ;)
ডেভিড পেরি

10

মানক পাঠ্য অনুসন্ধানের সরঞ্জামটি গ্রেপ

বর্তমান ডিরেক্টরিতে toUpperCase(সমস্ত .cফাইলের স্ট্রিংটি সন্ধান করতে :

grep -F 'toUpperCase(' *.c

আপনি যদি উপ-ডিরেক্টরিতেও সন্ধান করতে চান তবে:

grep -r --include='*.c' -F 'toUpperCase('

আপনি যদি সি ফাংশন কলগুলি সন্ধান করছেন, তবে সিটি্যাগগুলি আরও ভাল ফিট হতে পারে। আপনি এটি সনাক্তকারীদের একটি সূচক তৈরি করতে আপনার সমস্ত উত্স ফাইলগুলিতে একবার চালান, তারপরে কলগুলির মধ্যে নেভিগেট করতে আপনার সম্পাদককে ব্যবহার করুন। সমস্ত vi-মত সম্পাদকরা ctags এর TAGSফাইল ব্যবহার করতে পারেন । আপনি যদি ইমাস ব্যবহার করেন, অনুরূপ প্রোগ্রামটি চালান etags


ctagsফাংশন সংজ্ঞা অনুসন্ধান করার জন্য কার্যকর , ফাংশন কলগুলি নয়
JdeBP

6

আপনি ভিএম ব্যবহার করছেন। এটি অন্তর্নির্মিত করার জন্য আপনার কাছে একটি সরঞ্জাম পেয়েছে।

অনুমানযোগ্যভাবে, ইতিমধ্যে ব্যবহারের জন্য বলছে এমন সাতটি উত্তর রয়েছে grep। তবে আমি এখনও একমাত্র ব্যক্তি বলে মনে করি যিনি আপনার ব্যবহার থেকে আপনার প্রশ্নটি লক্ষ্য করেছেন vim। যেমন, যদিও আপনি করতে পারেন ব্যবহার grepভিতর থেকে vim, আপনি পারেন এছাড়াও ব্যবহার vimএর টুল বিল্ট-ইন। এটি :vimgrepকমান্ডের মাধ্যমে আহবান করা হয়েছে ।

"ফাংশনটিতে কল করার জন্য বর্তমান ডিরেক্টরিতে সমস্ত সি উত্সের ফাইল অনুসন্ধান করতে toUpperCase()" এক vimকমান্ডটি টাইপ করে

:vimgrep "\<toUpperCase\_s*(" *.c

মিলগুলির ফলাফলগুলি স্বয়ংক্রিয়ভাবে কুইকফিক্স তালিকায় লোড হয়ে যায়, উভয়ের সাথে অ্যাক্সেসযোগ্য (সূক্ষ্ম পার্থক্যের জন্য অন-লাইন সহায়তা দেখুন)

:copen
:cwin

ফাংশন সংজ্ঞাটি অনুসন্ধান করার চেয়ে এটির পরিবর্তে সন্ধান করা ctagsহ'ল হাতিয়ারটি, যেমন Gillesউত্তর:tjump বা উত্তর হিসাবে উল্লিখিত হিসাবে বা :tselectকমান্ডের সাথে মিলিত ।

কেন ব্যবহার করবেন :vimgrep?

অন-লাইন সহায়তা ( :help grep) বেশ কয়েকটি কারণে অঙ্কিত করে, যা আমি এখানে তোতা দেব না। এগুলি ছাড়াও, এর উত্তরের:vimgrep সাথে ক্রিয়াটি তুলনা করুন । কমান্ড লাইন প্রতিটি পৃথক সি উত্স ফাইলের জন্য পৃথক প্রক্রিয়া জোর করে । এমনকি এটি ওভারহেড কমাতে নিয়োগ দেয় না । এবং আপনার পাঠ্য সম্পাদককে প্রাপ্য উত্স ফাইলগুলিতে এটি শেষ হয়ে যাওয়ার পরে আউটপুটটি কোনওভাবেই পার্স করতে হবে। একাধিক অতিরিক্ত প্রক্রিয়া মোটেও কাঁটাচামচ করে না এবং ফলাফলটি ব্যবহার করা সরলতা is ফলস্বরূপ কুইকফিক্স তালিকার মধ্যে কেবল একটি প্রবেশিকা নির্বাচন করে স্বয়ংক্রিয়ভাবে কার্সারটি সম্পর্কিত উত্স ফাইলের প্রাসঙ্গিক লাইনে অবস্থান করে। dietbuddhadietbuddhagrepxargs:vimgrep

আসলে, এটি স্বয়ংক্রিয়ভাবে বাদে আপনি যা লিখেছিলেন তা হুবহু করে। এই খুব টেক্সট সম্পাদক ক্রিয়াকলাপ করার এটি স্বয়ংক্রিয় পদ্ধতি। এটি ফাইলটি লোড করে যেন হাতে হাতে লোড করে, এটি নিয়মিত এক্সপ্রেশনের জন্য অনুসন্ধান করে ( একই ধরণের নিয়মিত এক্সপ্রেশন সিনট্যাক্স যা আপনি ইতিমধ্যে অন্য কোথাও ব্যবহার করছেন vim), যেখানে ম্যাচগুলি ঘটে সেখানে রেকর্ড করে এবং ফাইলটি আনলোড করে।


2

হ্যাঁ, টুলটি বলা হয় grep

গ্রেপ কমান্ড একটি নির্দিষ্ট প্যাটার্নের সাথে মিল রেখে লাইনগুলির জন্য এক বা একাধিক ইনপুট ফাইলগুলি অনুসন্ধান করে। ডিফল্টরূপে, গ্রেপ মেলানো লাইনগুলি মুদ্রণ করে।

বেসিক ব্যবহার হ'ল:

grep something somewhere

বা, আরও নির্দিষ্টভাবে:

grep [some options] pattern file

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

grep -ri "touppercase()" .

আপনি যদি কেবল মিলে যাওয়া অংশগুলি চান তবে -oবিকল্পটি ব্যবহার করুন ।

গ্রেপ নিয়মিত ভাব প্রকাশ করতে পারে এবং এর একটি বিশাল ম্যানুয়াল রয়েছে


2

grepমান উত্তর - যাও recursively বা সাথে অনুসন্ধান করতে পারেন -r ফ্ল্যাগ ব্যবহার find(আলোচনা এবং যেমন এই সাইটে অন্য কোন প্রশ্ন, এ উদাহরণ এই এক )

আমার পছন্দের পছন্দটি ইদানীং হ'ল ack। এটি সম্ভবত আপনার কম্পিউটারে ইনস্টল করা নেই, তবে আপনি উবুন্টুতে অ্যাপটি-গেট ব্যবহার করে ইনস্টল করতে পারেন বা কেবল ডাউনলোড করতে পারেন। লিঙ্ক, নির্দেশাবলী এবং গ্রিপ থেকে ভাল যে কারণগুলি http://betterthangrep.com/ এ উপলব্ধ are


1

find এবং grep

find myproject -name '*.c' -exec grep 'toUpperCase(' {} \; -print

কেন শুধু নয় grep?

grep -r string .বর্তমান ডিরেক্টরিতে সমস্ত ফাইল পুনরাবৃত্তি করবে। আপনার যদি অবজেক্ট ফাইল বা অন্যান্য বাইনারি থাকে তবে আপনি বাইনারি ফলাফল ওরফে একটি ম্যাচ ফিরে পেতে পারেন। আবর্জনা। আপনার উপ-ডিরেক্টরিতে ফিফোস বা ডিভাইস ফাইলগুলিও ঘটে থাকলে আপনার অজানা / অনিচ্ছাকৃত পরিণতি হতে পারে।

grep string *.cকেবলমাত্র বর্তমান ডিরেক্টরি .cফাইলগুলি অনুসন্ধান করে ।

grep string **/*.c সমস্ত উপ-ডিরেক্টরি অনুসন্ধান করে। তবে, আপনার কাছে যদি খুব বড় সংখ্যক .cফাইল থাকে তবে আপনি শেল গ্লোবটির জন্য সর্বাধিক সংখ্যক প্রসারণের ঝুঁকিটি চালান। প্রসারণটিও প্রথমে ঘটতে হবে যার অর্থ একটি গাছ grepশুরু হওয়ার আগেই একটি পূর্ণ গাছের আড়াআড়ি ।


0

গ্রেপ কৌশলটি করবে তবে কিছুটা অতিরিক্ত স্ক্রিপ্টিং ফাইলের নাম এবং সঠিক রেখার রেফারেন্স খুঁজে পেতে সহায়তা করবে। আপনি যদি এটি চান তবে নীচের কাজগুলি ভালভাবে দেখতে পাচ্ছি। আমি এটি একটি শেল স্ক্রিপ্ট হিসাবে সংরক্ষণ করেছি এবং এটি প্রথম কমান্ড লাইন বিকল্প হিসাবে আমার পছন্দ হিসাবে মানটি পাস করব।

for i in $(ls)
do
    cat $i 2> /dev/null | grep $1 > /dev/null 2>&1
    STATUS=$?
    if [ $STATUS  -eq 0 ] ; then
        echo $i
        cat $i | grep -n $1
    fi
done

3
গ্রেপের একটি -H বিকল্প রয়েছে যা এটি ইতিমধ্যে এটি করে। গ্রেপ-যাই হোক না কেন *
রায় রিকো

প্রতিদিন নতুন কিছু শিখুন .. ধন্যবাদ @ রয় রিকো
টিম ব্রিগহাম

0

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

#!/usr/bin/bash

for i in $(ls *.c 2> /dev/null)
do
    cat $i 2> /dev/null | grep $1 > /dev/null 2>&1
    STATUS=$?

    if [ $STATUS  -eq 0 ] ; then
        echo "Found"
        exit
    fi
done

echo "Not found"

খুব বেশি ঝামেলা ছাড়াই ফাইল এক্সটেনশনের জন্য দ্বিতীয় যুক্তি স্বীকার করে আপনি এই শেল স্ক্রিপ্টটিকে আরও জেনেরিক করে তুলতে পারেন।

ডগ

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