एक विशेष स्ट्रिंग के लिए एक निर्देशिका में सभी .java फ़ाइलें grep


12

मैं मौजूदा निर्देशिका में सभी साधारण जावा (एक रेगेक्स नहीं) और ओएस एक्स पर सभी उप-निर्देशिकाओं के लिए .java फाइलें कैसे खोजूंगा? मैं केवल फ़ाइल और निर्देशिका नामों की एक सूची प्रिंट करना चाहता हूं जो मेल खाते हों।


यह पूछने के लिए धन्यवाद तो मुझे नहीं करना है। अब मुझे बस यह पता लगाना है कि ".गित" को कैसे बाहर करना है और मैं थोड़ा सा कर रहा हूं।
डैन रोसेनस्टार्क

मुझे लगता है कि js का उत्तर अधिक संक्षिप्त है, फिर भी बेकार है कि आपको टाइप करना होगा - फिर भी, लेकिन फिर भी। शायद यह छिपाने के लिए एक उपनाम लिख सकता है
क्रेग टैटरीन

जवाबों:


19

और हमेशा लोकप्रिय

find . -name '*.java' | xargs grep -l 'string'

EDIT (फ्रैंक स्ज़ीकुट्टा द्वारा):

यदि आप फ़ाइलनाम या निर्देशिका के साथ काम कर रहे हैं, जिसमें उनके स्थान हैं, तो ऐसा करने का सबसे सुरक्षित तरीका है:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

वहाँ हमेशा यह करने के लिए एक से अधिक तरीका है।



11

पारंपरिक UNIX उत्तर वह होगा जो इस प्रश्न के लिए स्वीकार किया गया था:

find . -name '*.java' | xargs grep -l 'string'

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

सीमाओं को असंदिग्ध बनाने के लिए नामों को अलग करने के लिए आपको वास्तव में क्या चाहिए:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

विकल्प यह है कि मार्क के लिए रन grep ढूंढने दें, क्योंकि मार्क बताता है कि यदि आप बड़ी संख्या में फाइलों को खोज रहे हैं, तो यह धीमा है (क्योंकि grep को एक बार फाइल की पूरी सूची के बजाय एक बार फाइल में इनवाइट किया गया है)।


आप उन फ़ाइल स्थान से निपटने के लिए xargs में "--replace" विकल्प का भी उपयोग कर सकते हैं: ... | xargs --rere grep 'string' '{}' ({} को फ़ाइल नाम से बदला जाएगा)
arathorn

1
खोज के आधुनिक संस्करण (OS X पर इंस्टॉल किए गए सहित) "-exec <कमांड> {} +" का समर्थन करते हैं, जहां अंत में प्लस साइन (\ के बजाय); खोजने के लिए {} को "" के साथ संभव के रूप में कई पैथनाम के साथ बताता है। ... यह xargs (1) के समान है "(मैन पेज से)।
डग हैरिस

7

ग्रेप कि ग्रेप, से बेहतर है का उपयोग करें पावती :

ack -l --java  "string" 

3
मैक डिफ़ॉल्ट रूप से मैक ओएस एक्स पर स्थापित नहीं है।
जॉन टॉपले

मुझे नहीं पता कि "डिफ़ॉल्ट रूप से" का क्या मतलब है। कई ओएस पर, आप चुनते हैं कि आप क्या स्थापित करते हैं ताकि उन कार्यक्रमों को ढूंढना मुश्किल हो जो हमेशा मौजूद रहते हैं। एक समय में, एक सी संकलक हमेशा था और पर्ल असामान्य था ...
bortzmeyer

1
इसका मतलब है कि यह मानक ओएस स्थापित का हिस्सा है। मेरे पास मेरे मैक पर डेवलपर टूल इंस्टॉल हैं और वे ack इंस्टॉल नहीं करते हैं। आपको इसे स्वयं स्थापित करना होगा। यदि आपके पास है, तो यह एक अच्छा वाक्यविन्यास है।
जॉन टॉपले

Ack के मामले में, यह एकल पर्ल प्रोग्राम है जिसमें कोई मॉड्यूल निर्भरता नहीं है। यदि आप अपने ~ / बिन निर्देशिका में प्रोग्राम "इंस्टॉल" कर सकते हैं, तो आप बस आसानी से "इंस्टॉल" कर सकते हैं।
एंडी लेस्टर

4

यह वास्तव में अगर आप चाहते हैं तो एक रेक्सक्स का उपयोग करेंगे, बस मेटाचैकर्स से दूर रहें, या उनसे बच जाएं, और आप स्ट्रिंग्स की खोज कर सकते हैं।

find . -iname "*.java" -exec egrep -il "search string" {} \;


3
grep -rl --include="*.java" simplestring *

1
यह यहाँ सबसे अच्छा जवाब लगता है - अगर grep यह सब करता है, तो खोज & xargs का उपयोग क्यों करें?
पीटर गिब्सन

FYI करें, जो प्रश्न में पूछा गया है, वह उस कमांड में छोटा "l" बड़ा "L" नहीं होना चाहिए
क्रेग टैटरीन

क्रेग सही है, मैंने अपना उत्तर सही किया।
जे.एस.

1

चूंकि यह एक OSX प्रश्न है, यहाँ एक अधिक OSX विशिष्ट उत्तर है।

कमांड लाइन से छोड़ें findऔर उपयोग करें Spotlight। बहुत अधिक शक्तिशाली!

COMMAND LINE SPOTLIGHT - FIND MEETS GREP

ज्यादातर लोग नहीं जानते कि आप कमांड लाइन से स्पॉटलाइट खोज कर सकते हैं। याद रखें कि सभी आर्कन खोज और grep विकल्प क्या हैं और क्या नहीं जब आप स्पॉटलाइट को आपके लिए काम करने दे सकते हैं। स्पॉटलाइट के लिए कमांड लाइन इंटरफ़ेस को mdfind कहा जाता है। यह GUI स्पॉटलाइट खोज और अधिक के रूप में सभी समान शक्ति है क्योंकि यह कमांड लाइन पर स्क्रिप्ट करने योग्य है!


0

यह एक जाने दो:

grep -rl "string" */*java

1
यह मैक ओएस एक्स पर "grep: * / * जावा: कोई ऐसी फाइल या निर्देशिका" नहीं देता है
जॉन टॉपले

यहाँ समस्या यह है कि यह केवल * .java फ़ाइलों को एक स्तर गहरी खोजेगी। IMHO के लिए मार्क थालमन के उत्तर को करने का उचित तरीका देखें।
लुडविग वेन्ज़िएल

क्षमा करें, मेरे मैक पर नहीं। क्या grep के Mac संस्करण में -r (-Rursive) ध्वज नहीं है?
dwj

यह करता है, लेकिन यह वह आउटपुट था जो मुझे उस स्ट्रिंग की खोज करते समय मिला जो मुझे पता है कि फाइलों में है।
जॉन टॉपले

0

आप इंटरफ़ेस में विकल्प हैं जहाँ अधिक सहज खोज करने के लिए TextWrangler जैसे GUI प्रोग्राम का उपयोग कर सकते हैं।


0
grep "(your string)" -rl $(find ./ -name "*.java")

यदि आप मामले को नजरअंदाज करना चाहते हैं, तो जगह-sur -irl के साथ। (आपका तार) भी एक आवेश हो सकता है यदि आप कभी भी आवश्यकता देखते हैं।

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