एक जटिल खोज के लिए खोज और संक्षिप्त संयोजन कैसे करें? (GNU / linux, find, grep)


17

मैं कुछ फ़ाइलों में एक पाठ खोज करने की कोशिश कर रहा हूं जो समान निर्देशिका संरचना को साझा करते हैं, लेकिन GNU / Linux में समान निर्देशिका ट्री में नहीं हैं।

मेरे पास कई साइटों के साथ एक वेब सर्वर है जो एक ही पेड़ संरचना (कोड इग्नाइटर एमवीसी PHP फ्रेमवर्क) को साझा करते हैं, इसलिए मैं प्रत्येक साइट के लिए पेड़ के नीचे एक विशिष्ट निर्देशिका में खोज करना चाहता हूं, उदाहरण:

/srv/www/*/htdocs/system/application/

जहां * साइट का नाम है। और उन से आवेदन निर्देशिकाओं से, मैं एक * .php फ़ाइल के लिए इसके पत्ते के नीचे के सभी वृक्षों को खोजना चाहता हूं, अंदर कुछ पाठ पैटर्न है, चलो "डिबग" कहें, कोई नियमित अभिव्यक्ति की आवश्यकता नहीं है।

मुझे पता है कि कैसे खोजने के लिए और का उपयोग करने के लिए grep लेकिन मैं उनके संयोजन में अच्छा नहीं हूं।

यह मैं कैसे करूंगा?
अग्रिम में धन्यवाद!

जवाबों:


21

प्रयत्न

find /srv/www/*/htdocs/system/application/ -name "*.php" -exec grep "debug (" {} \; -print

यह विस्तार से applicationफ़ाइलों के लिए फ़ोल्डर्स को पुन: खोज करना चाहिए .phpऔर उन्हें पास करना चाहिए grep

इस पर एक अनुकूलन निष्पादित करना होगा:

find /srv/www/*/htdocs/system/application/ -name "*.php" -print0 | xargs -0 grep -H "debug ("

यह एकल कमांड के तर्क के रूप में xargsसभी .phpफाइल आउटपुट को पास करने के लिए उपयोग करता है ; जैसे, । का विकल्प और का विकल्प फ़ाइल और निर्देशिका नामों में रिक्तियां सुनिश्चित सही ढंग से नियंत्रित किया जाता है। विकल्प के लिए पारितfindgrepgrep "debug (" file1 file2 file3-print0find-0xargs-Hgrep सुनिश्चित करें कि फ़ाइल नाम सभी स्थितियों में छपा है। (डिफ़ॉल्ट रूप से, grepफ़ाइल नाम तब ही प्रिंट करता है जब कई तर्क पास किए जाते हैं।)

आदमी से xargs:

-0

      इनपुट आइटम को व्हाट्सएप के बजाय एक अशक्त चरित्र द्वारा समाप्त किया जाता है, और उद्धरण और बैकलैश विशेष नहीं हैं (प्रत्येक वर्ण को शाब्दिक रूप से लिया गया है)। फ़ाइल स्ट्रिंग के अंत को अक्षम करता है, जिसे किसी अन्य तर्क की तरह माना जाता है। उपयोगी जब इनपुट आइटम में सफेद स्थान, उद्धरण चिह्न या बैकस्लैश हो सकते हैं। GNU खोज -print0विकल्प इस मोड के लिए उपयुक्त इनपुट का उत्पादन करता है।


1
+1। हालांकि, प्रत्येक php फ़ाइल के लिए grep निष्पादित करेगा। यदि बहुत सारी फाइलें हैं, तो आप इसके द्वारा और आगे बढ़ा सकते हैंfind /srv/www/*/htdocs/system/application/ -name "*.php" -print0 | xargs -0 grep "debug ("
जुक्का मटिलैनेन

@ जेकम सहमत। मैं उसी हिसाब से अपना जवाब अपडेट करूंगा।

2
एक और छोटा सुधार: xargs को grep में केवल एक फ़ाइल नाम दिया जा सकता है, अगर मैच होने पर grep फ़ाइल नाम नहीं दिखाएगा। आप इसे फ़ाइल नाम दिखाने के लिए बाध्य करने के लिए grep कमांड में -H जोड़ना चाहते हैं।
रैंडी ऑरिसन 14

@ रंडी यह एक बहुत ही मान्य बिंदु है।

3
यह सच्ची नेक्रोमेंसी है, लेकिन एक ही तरह की एकल प्रक्रिया निष्पादन करने के बजाय ऑपरेटर GNU findको ले जा सकती है। इस प्रकार, इस उत्तर में उदाहरण के रूप में एक ही बात करता है , लेकिन एक कम प्रक्रिया कांटा के साथ (और फ़ाइल नाम मुसीबतों के लिए अभी भी 0 जोखिम)। +\;xargsfind /srv/www/*/htdocs/system/application/ -name "*.php" -exec grep -H "debug (" {} +xargs
डैनियल एंडरसन

10

findइस उदाहरण के लिए भी आवश्यक नहीं है, एक grepसीधे (कम से कम GNU grep) का उपयोग कर सकता है :

grep -RH --include='*.php' "debug (" /srv/www/*/htdocs/system/application/

और हम एक एकल प्रक्रिया कांटे के नीचे हैं।

विकल्प:

  • -R, --dereference-recursive Read all files under each directory, recursively. Follow all symbolic links, unlike -r.
  • -H, --with-filename Print the file name for each match. This is the default when there is more than one file to search.
  • --include=GLOB Search only files whose base name matches GLOB (using wildcard matching as described under --exclude).
  • --exclude=GLOB Skip any command-line file with a name suffix that matches the pattern GLOB, using wildcard matching; a name suffix is either the whole name, or any suffix starting after a / and before a +non-/. When searching recursively, skip any subfile whose base name matches GLOB; the base name is the part after the last /. A pattern can use *, ?, and [...] as wildcards, and \ to quote a wildcard or backslash character literally.

बस जिज्ञासा के लिए, -RHविकल्पों का क्या मतलब है?
गस

@Gus: पोस्ट man grepमें विकल्प विवरणों का कुछ अंश जोड़ा गया ।
डैनियल एंडर्सन

0

आपका शेल php फ़ाइलों को ढूँढ सकता है और उन्हें grep दे सकता है। बैश में:

shopt -s nullglob globstar
grep searchterm /srv/www/*/htdocs/system/application/**/*.php
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.