बैश: फ़ाइलों की निर्देशिका में किसी विशेष स्ट्रिंग की खोज करने का एक तरीका है? [डुप्लिकेट]


47

संभावित डुप्लिकेट:
लिनक्स में एक पाठ पैटर्न के लिए खोजें

बाश में, मैं सोच रहा था कि क्या कोई आदेश थे जो आपको बताएंगे कि क्या आप जिस विशेष स्ट्रिंग की तलाश कर रहे हैं वह मौजूदा निर्देशिका में मौजूद फ़ाइलों के भीतर मौजूद है।

मान लें कि आप अपनी वर्तमान निर्देशिका में C फ़ाइलों के एक सेट के भीतर 'toUpperCase' () फ़ंक्शन की तलाश कर रहे हैं। बहुत सारी फाइलें हैं, इसलिए आप मैन्युअल रूप से हर एक को खोलना नहीं चाहेंगे और vim का उपयोग करके स्ट्रिंग 'toUpperCase' की जांच करेंगे क्योंकि इसमें बहुत समय लगेगा। यदि बैश कमांड लाइन नहीं है, तो क्या इसे कुशलतापूर्वक करने के लिए एक और तरीका है?

जवाबों:


64

के साथ grep:

grep -R "toUppercase()" *

या, अगर आपके पास ack-grep स्थापित है, तो बस:

ack-grep "toUppercase"

यदि आप सी फाइलों में खोज को सीमित करना चाहते हैं, तो ack-grep:

ack-grep -cc "toUppercase()"

ack-grepOSX पर भी स्थापित किया जा सकता है, लेकिन निष्पादन योग्य बस कहा जाता है ack


इतना तो एसओ के पास पहले से ही एक संदिग्ध समान प्रश्न है ;)
डेविड पेरी

10

मानक पाठ खोज उपकरण grep है

वर्तमान निर्देशिका toUpperCase(में सभी .cफ़ाइलों में स्ट्रिंग देखने के लिए :

grep -F 'toUpperCase(' *.c

यदि आप उपनिर्देशिका में भी देखना चाहते हैं:

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

यदि आप C फ़ंक्शन कॉल की तलाश कर रहे हैं, तो ctags बेहतर फिट हो सकते हैं। आप इसे अपने सभी स्रोत फ़ाइलों पर एक बार पहचानकर्ताओं का एक सूचकांक बनाने के लिए चलाते हैं, फिर कॉल के बीच नेविगेट करने के लिए अपने संपादक का उपयोग करें। सभी vi- जैसे संपादक ctags की TAGSफ़ाइल का उपयोग कर सकते हैं । यदि आप Emacs का उपयोग करते हैं, तो समान प्रोग्राम चलाएं etags


ctagsफ़ंक्शन परिभाषाएँ खोजने के लिए उपयोगी है , फ़ंक्शन कॉल नहीं ।
JdeBP

6

आप विम का उपयोग कर रहे हैं। आपको इसे बनाने के लिए एक टूल मिला है।

जाहिर है, वहाँ सात जवाब पहले से ही उपयोग करने के लिए कह रहे हैं grep। लेकिन मैं इस तरह का एकमात्र व्यक्ति प्रतीत होता हूं जिसने अब तक आपके प्रश्न पर ध्यान दिया है जो आप उपयोग कर रहे हैं vim। जैसे, यद्यपि आप भीतर से उपयोग कर सकते हैं , आप अंतर्निहित टूल का उपयोग भी कर सकते हैं । यह कमांड के माध्यम से लगाया जाता है । grepvimvim:vimgrep

फ़ंक्शन के कॉल के लिए वर्तमान निर्देशिका में सभी सी स्रोत फ़ाइलों को खोजने के लिए toUpperCase()"एक प्रकार का vimकमांड

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

मैचों की परिणामी सूची स्वचालित रूप से क्विकफ़िक्स सूची में लोड हो जाती है, दोनों में से किसी के साथ सुलभ (सूक्ष्म अंतर के लिए ऑन-लाइन मदद देखें)

:copen
:cwin

फ़ंक्शन की परिभाषा को खोजने के लिए , इसके बजाय कॉल करने के लिए, ctagsउपकरण है, जैसा कि Gillesउत्तर में , :tjumpया :tselectआदेशों के साथ संयोजन में वर्णित है ।

क्यों उपयोग करें :vimgrep?

ऑन-लाइन मदद ( :help grep) कई कारणों को बताती है, जो मैं यहां तोता नहीं करूंगा। इसके अलावा उन लोगों के लिए, की कार्रवाई की तुलना :vimgrepके साथ dietbuddhaके जवाबdietbuddhaकमांड लाइन grepप्रत्येक व्यक्ति सी स्रोत फ़ाइल के लिए एक व्यक्तिगत प्रक्रिया की मांग करता है । यह xargsउस ओवरहेड को कम करने के लिए भी काम नहीं करता है । और आपको अभी भी किसी भी तरह से अपने पाठ संपादक को प्रासंगिक स्रोत फ़ाइलों पर समाप्त करने के लिए आउटपुट को पार्स करना होगा, जब यह समाप्त हो जाए। :vimgrepकई अतिरिक्त प्रक्रियाओं को बिल्कुल भी कांटा नहीं करता है, और परिणाम का उपयोग करना सरलता ही है। परिणामी क्विकफ़िक्स सूची में प्रविष्टियों में से किसी एक का चयन करना, स्वचालित रूप से संबंधित स्रोत फ़ाइल की प्रासंगिक पंक्ति पर कर्सर को स्थित करता है।

वास्तव में, यह वही करता है जो आपने लिखा था आप हाथ से करेंगे, स्वचालित रूप से छोड़कर। यह उन बहुत ही पाठ संपादक कार्यों को करने का स्वचालित तरीका है। यह फ़ाइल को ऐसे लोड करता है जैसे कि हाथ से लोड किया गया है, इसे एक नियमित अभिव्यक्ति के लिए खोजता है ( उसी नियमित अभिव्यक्ति सिंटैक्स का उपयोग करना जो आप पहले से कहीं और उपयोग कर रहे हैं vim), उन स्थानों को रिकॉर्ड करता है जहां मैच होते हैं, और फिर फ़ाइल को अनलोड करता है।


2

हाँ, उपकरण कहा जाता है grep

Grep कमांड एक निर्दिष्ट पैटर्न से मेल खाने वाली लाइनों के लिए एक या अधिक इनपुट फ़ाइलों को खोजता है। डिफ़ॉल्ट रूप से, grep मिलान लाइनों को प्रिंट करता है।

मूल उपयोग है:

grep something somewhere

या, विशेष रूप से:

grep [some options] pattern file

एक बहुत ही सरल मामले में, आप सभी फ़ाइलों के माध्यम से खोज करना चाहते हैं, इस प्रकार आप -rविकल्प की आपूर्ति करते हैं । यदि आप अपरकेस या लोअरकेस की परवाह नहीं करते हैं, तो -iविकल्प के साथ इसे असंवेदनशील बनाएं ।

grep -ri "touppercase()" .

यदि आप केवल मिलान भागों चाहते हैं, तो -oविकल्प का उपयोग करें ।

ग्रेप नियमित अभिव्यक्ति का उपयोग कर सकता है , और इसका एक बहुत बड़ा मैनुअल है


2

grepमानक उत्तर है - या तो -r ध्वज का उपयोग करके पुनः खोज करने के लिए या findइस साइट पर अन्य प्रश्नों में चर्चा (और उदाहरणों के साथ , जैसे कि यह )

मेरी पसंदीदा पसंद हाल ही में है ack। यह आपके कंप्यूटर पर स्थापित होने की संभावना नहीं है, लेकिन आप उबंटू पर एप्टी-गेट का उपयोग करके स्थापित कर सकते हैं या बस डाउनलोड कर सकते हैं। लिंक, निर्देश, और कारण कि यह grep से बेहतर है http://betterthangrep.com/ पर उपलब्ध है


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
grep में -H विकल्प है जो पहले से ही ऐसा करता है। grep- जो कुछ भी *
रॉय रिको

हर दिन कुछ नया सीखें .. धन्यवाद @Roy रिको
टिम ब्रिघम

0

मुझे यह दिलचस्प लगता है कि किसी ने आपके विशिष्ट प्रश्न का उत्तर नहीं दिया है: "मुझे कैसे पता चलेगा कि वर्तमान निर्देशिका में स्थित फ़ाइलों के भीतर एक विशेष स्ट्रिंग मौजूद है या नहीं"। जहां तक ​​मुझे पता है कि कोई grep विकल्प नहीं है जो केवल रिटर्न देता है कि क्या फ़ाइलों के समूह में एक मैच पाया गया है। फ़ाइल नाम (ओं) को सूचीबद्ध करने के लिए निकटतम विकल्प -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"

आप बहुत अधिक परेशानी के बिना फ़ाइल एक्सटेंशन के लिए दूसरा तर्क स्वीकार करके इस शेल स्क्रिप्ट को और अधिक सामान्य बना सकते हैं।

डौग

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.