किसी दिए गए पाठ से युक्त फ़ाइलें खोजें


153

बाश में मैं .php|.html|.jsकेस-असंवेदनशील स्ट्रिंग वाली हर फ़ाइल के लिए फ़ाइल नाम (और फ़ाइल का पथ) वापस करना चाहता हूं"document.cookie" | "setcookie"

मुझे यह कैसे करना है?


4
क्या आपने अभी grep का उपयोग करने पर विचार किया है? cyberciti.biz/faq/grep-in-bash
टेरेंस

यह शीर्षक काफी भ्रामक है। "फाइंड-फाइल्स-युक्त-ए-दी-टेक्स्ट"
जोश C

जवाबों:


212
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .

rझंडा (खोज उपनिर्देशिका) रिकर्सिवली खोज करने के लिए इसका मतलब है। iझंडा केस संवेदी मतलब है।

यदि आप केवल फ़ाइल नाम जोड़ना चाहते हैं l(निचला L) ध्वज:

egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .

कि मेरे लिए काम नहीं लगता था (कम से कम मैक पर नहीं) .... बस रुक जाता है ... egrep -lir --include = * "रेपो" egrep: चेतावनी: stdin की पुनरावर्ती खोज
डीन हिलर

13
आप खोज करने के लिए पथ जोड़ना भूल गए। रास्ता है '।' उपरोक्त उदाहरण में। आपके मामले में, स्क्रिप्ट स्टड पर खोज करने के लिए इनपुट की प्रतीक्षा कर रही है। कोशिश करें: egrep -lir --include = * "रेपो" / (या कोई अन्य पथ)
LodeRunner

1
grep -E ... >egrep ...
अमन

मुझे grep: (error|fail): No such file or directoryUbuntu डेस्कटॉप 16 पर त्रुटि मिली ; कोई संकेत?
नाम जी वीयू

मुझे यह काम करने के लिए, मुझे * with \ स्किप करना पड़ा। इसलिए मेरे पास है--include=\*.{php,html,js}
मेहद महमूदियन

53

कुछ ऐसा आजमाएं grep -r -n -i --include="*.html *.php *.js" searchstrinhere .

-iयह मामला insensitlve बनाता है

.अंत का मतलब है कि आप अपने वर्तमान निर्देशिका से शुरू करना चाहते हैं, यह किसी भी निर्देशिका के साथ प्रतिस्थापित किया जा सकता है।

-rसाधन रिकर्सिवली ऐसा करते हैं, सही निर्देशिका वृक्ष नीचे

-nमैचों के लिए लाइन नंबर प्रिंट करता है।

--includeआप फ़ाइल नाम, एक्सटेंशन जोड़ सकते हैं। वाइल्डकार्ड स्वीकार किए जाते हैं

अधिक जानकारी के लिए देखें: http://www.gnu.org/software/grep/


4
या शायद -lविकल्प का उपयोग करें (सिर्फ मैच के प्रिंट फ़ाइलनाम)-n
ग्लेन जैकमैन के

15

findउन्हें और grepस्ट्रिंग के लिए:

यह नियमित अभिव्यक्ति के लिए आपके 3 प्रकार / शुरू / पथ और grep में सभी प्रकार की फाइलें ढूंढेगा '(document\.cookie|setcookie)'। सिर्फ पठनीयता के लिए बैकस्लैश के साथ 2 लाइनों पर विभाजित करें ...

find /starting/path -type f -name "*.php" -o -name "*.html" -o -name "*.js" | \
 xargs egrep -i '(document\.cookie|setcookie)'

1
खोजने के सार्वभौमिक उपयोग की तरह, लेकिन मेरे दिमाग का बेहतर उपयोग करने के लिए-exec grep -l 'sth' {} \;
NGix

धन्यवाद @Michael Berkowski इस तरह से # egrep -ir --include=file.foo "(foo|bar)" /dir~ 500Gb weigth डायरेक्टरी पर 5 या 8 से अधिक बार सबसे तेज़ ।
Qh0stM4N

9

के लिए एक आदर्श नौकरी की तरह लगता है grepया शायद पावती

या यह अद्भुत निर्माण:

find . -type f \( -name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null {} \;

+1 का उपयोग करना -exec grep...मेरी xargsविधि से बेहतर है क्योंकि यह फ़ाइल नाम के स्थानों पर चोक नहीं करेगा।
माइकल बर्कोव्स्की

@MichaelBerkowski: आप इसे इस तरह का उपयोग फ़ाइल नाम में सफेद स्थान के साथ निपटने के लिए कर सकते हैं: find . -type f -print0 | xargs -0 -I {} grep "search_string" {}। बेशक, अन्य विकल्पों को भी जोड़ा जा सकता है।
पास्कल


3

बस एक और विकल्प शामिल करने के लिए, आप इसका उपयोग भी कर सकते हैं:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \;

कहाँ पे:

  • -regextype posix-extendedबताता है findकि किस तरह की रेगेक्स की उम्मीद है
  • -regex "^.*\.(php|html|js)$"findरेगेक्स ही बताता है कि फ़ाइल नाम से मेल खाना चाहिए
  • -exec grep -EH '(document\.cookie|setcookie)' {} \;findविकल्प और उसके बीच की प्रत्येक फ़ाइल -execके \;लिए निर्दिष्ट कमांड (इसके विकल्पों और तर्कों के साथ) को चलाने के लिए कहता है, जहां यह बताता है कि {}इस कमांड में फ़ाइल पथ कहाँ जाता है।

    जबकि

    • E विकल्प बताता है grep विस्तारित रेगेक्स (कोष्ठकों का समर्थन करने के लिए) और ... का उपयोग करने के लिए है
    • Hविकल्प grepमैचों से पहले फ़ाइल पथ मुद्रित करने के लिए कहता है।

और, इसे देखते हुए, यदि आप केवल फ़ाइल पथ चाहते हैं, तो आप उपयोग कर सकते हैं:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \; | sed -r 's/(^.*):.*$/\1/' | sort -u

कहाँ पे

  • |[पाइप] इसके findबाद अगले कमांड का आउटपुट भेजें (जो sedतब है sort)
  • rविकल्प sedविस्तारित रेगेक्स का उपयोग करने के लिए कहता है।
  • s/HI/BYE/कहता है sed"अलविदा" और के साथ "हाय" के हर पहले घटना (प्रति पंक्ति) को बदलने के लिए ...
  • s/(^.*):.*$/\1/इसे रेगेक्स को बदलने के लिए कहता है (^.*):.*$(मतलब एक समूह [सामानों से घिरा हुआ ()] जिसमें सब कुछ शामिल है [ .*= एक या किसी भी चरित्र का] लाइन की शुरुआत से [ ^] तक 'पहले': 'के अंत तक कुछ भी ' के बाद बदला हुआ रेगेक्स के पहले समूह [ ] द्वारा लाइन [ $] ]।\1
  • uडुप्लिकेट प्रविष्टियों को हटाने के लिए सॉर्ट करता है ( sort -uवैकल्पिक रूप में लें )।

... सबसे सुंदर तरीका होने से एफएआर। जैसा कि मैंने कहा, मेरा इरादा संभावनाओं की सीमा को बढ़ाना है (और कुछ टूल्स जो आप उपयोग कर सकते हैं उन पर अधिक संपूर्ण स्पष्टीकरण देना)।

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