मैं उन सभी फाइलों को ढूंढना चाहता हूं जिनमें पाठ की एक विशिष्ट स्ट्रिंग है । द grep
कमांड काम करता है, लेकिन मुझे नहीं पता कि इसे हर निर्देशिका के लिए कैसे उपयोग किया जाए (मैं इसे केवल अपनी वर्तमान निर्देशिका के लिए कर सकता हूं) । मैंने पढ़ने की कोशिश की man grep
, लेकिन इससे कोई मदद नहीं मिली ।
इसका उपयोग करना बेहतर होगा
grep -rl "string" /path
जहां
-
-r
(या--recursive
) विकल्प का उपयोग सभी उप-निर्देशिकाओं को भी पार करने के लिए किया जाता है/path
, जबकि -
-l
(या--files-with-matches
) विकल्प का उपयोग केवल मिलान फ़ाइलों के फ़ाइल नामों को प्रिंट करने के लिए किया जाता है, न कि मिलान लाइनों (यह भी गति में सुधार कर सकता है, यह देखते हुएgrep
इस विकल्प के साथ पहले मैच में एक फ़ाइल पढ़ना बंद करें) ।
यदि आप फ़ाइलों में मेल खाने वाली लाइनों की तलाश में हैं, तो मेरा पसंदीदा आदेश है:
grep -Hrn 'search term' path/to/files
-
-H
फ़ाइल नाम मुद्रित होने का कारण बनता है (कई फ़ाइलों की खोज होने पर निहित) -
-r
एक पुनरावर्ती खोज करता है -
-n
लाइन नंबर को प्रिंट करने का कारण बनता है
path/to/files
हो सकता है .
वर्तमान निर्देशिका में खोज करने के लिए
आगे के विकल्प जो मुझे बहुत उपयोगी लगते हैं:
-
-I
बाइनरी फ़ाइलों को अनदेखा करें (पूरक:-a
पाठ के रूप में सभी फ़ाइलों का इलाज) -
-F
इलाजsearch term
एक शाब्दिक के रूप में, एक नियमित अभिव्यक्ति नहीं -
-i
केस-असंवेदनशील खोज करें -
--color=always
पाइपिंग के माध्यम से भी रंगों को मजबूर करने के लिएless
. बनाने के लिएless
समर्थन रंग, आपको उपयोग करना होगा-r
विकल्प:grep -Hrn search . | less -r
-
--exclude-dir=dir
जैसे निर्देशिकाओं को बाहर करने के लिए उपयोगी.svn
और.git
.
मुझे विश्वास है कि आप कुछ इस तरह का उपयोग कर सकते हैं:
find /path -type f -exec grep -l "string" {} \;
टिप्पणियों से स्पष्टीकरण
find
एक कमांड है जो आपको किसी दिए गए पथ की उपनिर्देशिकाओं में निर्देशिका और लिंक जैसी फ़ाइलों और अन्य वस्तुओं को खोजने देता है । यदि आप एक मुखौटा निर्दिष्ट नहीं करते हैं जो फ़ाइल नाम मिलना चाहिए, तो यह सभी निर्देशिका वस्तुओं की गणना करता है ।
-
-type f
निर्दिष्ट करता है कि इसे केवल फाइलों को संसाधित करना चाहिए, निर्देशिकाओं आदि को नहीं । -
-exec grep
निर्दिष्ट करता है कि प्रत्येक मिली फ़ाइल के लिए, इसे ग्रेप कमांड चलाना चाहिए, इसके फ़ाइल नाम को एक तर्क के रूप में, प्रतिस्थापित करके{}
फ़ाइल नाम के साथ
मेरा डिफ़ॉल्ट आदेश है
grep -Rin string *
मैं एक कैपिटल 'आर' का उपयोग करता हूं क्योंकि ls
पुनरावर्ती के लिए इसका उपयोग करता है । चूंकि ग्रेप दोनों को स्वीकार करता है, इसका उपयोग न करने का कोई कारण नहीं है ।
संपादित करें: प्रति एचवीएनस्वीटिंग, जाहिरा तौर पर -R
सिम्लिंक का पालन करेंगे जहां के रूप में -r
नहीं होगा ।
यदि आप कुछ नया करने को तैयार हैं, तो दें ack
एक शॉट। वर्तमान निर्देशिका को पुनरावर्ती रूप से खोजने का आदेश string
है:
ack string
स्थापना काफी सरल है:
curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3
(बशर्ते आपको पहले से ही निर्देशिका मिल गई हो ~/bin
और यह आपके में अधिमानतः है PATH
.)
कमांड आरजीआरईपी ऐसी आवश्यकता के लिए समर्पित है
यदि उपलब्ध नहीं है, तो आप इसे इस तरह प्राप्त कर सकते हैं
mkdir -p ~/bincd ~/binwget http://sdjf.esmartdesign.com/files/rgrepchmod +x rgrep
आप ऊपर बताए अनुसार सीधे अपने डिफ़ॉल्ट ग्रेप विकल्पों में सेट कर सकते हैं ।
मैं personnaly का उपयोग करें
[[ ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"args="${args:--Hns} --color=auto"
संबंधित विषय : रंग के साथ हमेशा आरजीआरईपी का उपयोग कैसे करें
अद्यतन 2:
का उपयोग कर आदेशों की यह पंक्ति find
और grep
समस्या को ठीक करता है:
$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +
--color=<always or auto>
रंगीन आउटपुट के लिए:
$ find path_to_search_in -type f \ -exec grep --color=always -in searchString {} 2>/dev/null +
उदाहरण:
$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +
नीचे स्नैपशॉट में एक उदाहरण चलाया गया:
अद्यतन 1:
आप निम्नलिखित कोड का प्रयास कर सकते हैं; अपने में एक समारोह के रूप में .bashrc
या .bash_aliases
या एक स्क्रिप्ट में:
wherein () { for i in $(find "$1" -type f 2> /dev/null); do if grep --color=auto -i "$2" "$i" 2> /dev/null; then echo -e "\033[0;32mFound in: $i \033[0m\n"; fi; done}
उपयोग: wherein /path/to/search/in/ searchkeyword
उदाहरण:
$ wherein ~/Documents/ "hello world"
(नोट: जैसा कि @एनज़ोटिब द्वारा नीचे दी गई टिप्पणियों में सुझाया गया है, यह उनके नामों में रिक्त स्थान सहित फ़ाइल/निर्देशिकाओं के साथ काम नहीं करता है । )
मूल पोस्ट
स्ट्रिंग के लिए खोज करने के लिए और खोज स्ट्रिंग के साथ बस उस लाइन को आउटपुट करें:
$ for i in $(find /path/of/target/directory -type f); do \ grep -i "the string to look for" "$i"; done
जैसे:
$ for i in $(find /usr/share/applications -type f); \ do grep -i "web browser" "$i"; done
खोज स्ट्रिंग युक्त फ़ाइल नाम प्रदर्शित करने के लिए:
$ for i in $(find /path/of/target/directory -type f); do \ if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;
जैसे:
$ for i in $(find /usr/share/applications -type f); \ do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \ fi; done;
grep
(जीएनयू या बीएसडी)
आप उपयोग कर सकते हैं grep
उपकरण के साथ बारी बारी से वर्तमान फ़ोल्डर खोज करने के लिए -r
पैरामीटर, जैसे:
grep -r "pattern" .
नोट: -r
- बारी बारी से खोज subdirectories.
विशिष्ट फ़ाइलों के भीतर खोजने के लिए, आप एक का उपयोग कर सकते हैं globbing वाक्य रचना जैसे कि:
grep "class foo" **/*.c
नोट: का उपयोग करके globbing विकल्प (**
), यह सभी फ़ाइलों को विशिष्ट एक्सटेंशन या पैटर्न के साथ पुनरावर्ती रूप से स्कैन करता है । इस सिंटैक्स को सक्षम करने के लिए, चलाएँ: shopt -s globstar
. आप भी उपयोग कर सकते हैं **/*.*
सभी फ़ाइलों के लिए (छिपे हुए और बिना एक्सटेंशन को छोड़कर) या किसी अन्य पैटर्न के लिए ।
यदि आपको त्रुटि है कि आपका तर्क बहुत लंबा है, तो अपनी खोज को कम करने या उपयोग करने पर विचार करें find
इसके बजाय सिंटैक्स जैसे:
find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'
वैकल्पिक रूप से उपयोग करें ripgrep
.
ripgrep
यदि आप बड़ी परियोजनाओं या बड़ी फ़ाइलों पर काम कर रहे हैं, तो आपको इसका उपयोग करना चाहिए ripgrep
इसके बजाय, जैसे:
rg "pattern" .
डॉक्स, इंस्टॉलेशन स्टेप्स या सोर्स कोड को चेकआउट करें GitHub परियोजना पृष्ठ.
यह किसी भी अन्य उपकरण की तुलना में बहुत तेज है जीएनयू/बीएसडी grep
, ucg
, ag
, sift
, ack
, pt
या समान, क्योंकि यह शीर्ष पर बनाया गया है जंग के regex इंजन जो बहुत तेजी से खोज करने के लिए परिमित ऑटोमेटा, सिमड और आक्रामक शाब्दिक अनुकूलन का उपयोग करता है ।
यह निर्दिष्ट पैटर्न को अनदेखा करने का समर्थन करता है .gitignore
फ़ाइलें, इसलिए एक एकल फ़ाइल पथ को एक साथ कई ग्लोब पैटर्न के खिलाफ मिलान किया जा सकता है ।
आप सामान्य मापदंडों का उपयोग कर सकते हैं जैसे:
-
-i
- असंवेदनशील खोज। -
-I
- बाइनरी फ़ाइलों को अनदेखा करें । -
-w
- पूरे शब्दों के लिए खोजें (आंशिक शब्द मिलान के विपरीत) । -
-n
- अपने मैच की लाइन दिखाएं। -
-C
/--context
(उदा.-C5
)- संदर्भ बढ़ाता है, इसलिए आप आसपास के कोड को देखते हैं । -
--color=auto
- मिलान पाठ को चिह्नित करें । -
-H
- फ़ाइल नाम प्रदर्शित करता है जहां पाठ पाया जाता है । -
-c
- मिलान लाइनों की गिनती प्रदर्शित करता है । के साथ जोड़ा जा सकता-H
.
मैं एक्सएआरजीएस का उपयोग करके ऐसा करता हूं, एक बहुत ही कम कमांड
find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'
खोजें ।/ आपको वर्तमान फ़ोल्डर में सभी फाइलों की एक पुनरावर्ती सूची देता है, फिर आप इसे उन फाइलों में से प्रत्येक पर ग्रेप कमांड निष्पादित करने वाले एक्सएआरजी को पाइप करते हैं
मुझे पता है कि यहां बहुत सारे उत्तर हैं, लेकिन यहां एक विकल्प है यदि आप फ़ाइलों को खोजते समय अन्य प्रतिबंध जोड़ना चाहते हैं:
find . -type f -exec grep --quiet string_to_look_for {} ';' -print
यह काम करता है क्योंकि grep
यदि परिणाम मिला तो 0 वापस आ जाएगा, अन्यथा 1 । उदाहरण के लिए आप 1 एमबी बड़ी फाइलें पा सकते हैं और कुछ युक्त:
find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print
कई आवश्यकताओं के लिए आप शायद अनुकूलक ध्वज का उपयोग करना चाहते हैं -O
यह जीएनयू ग्रेप में मौजूद है ।
वाइल्डकार्ड के साथ ’ – शामिल="* । C", विकल्प` @user311346, धन्यवाद करने के लिए @Lekensteyn.
ग्रेप-रिन <योर पैटर्न > * सभी पाठ फ़ाइलों में नीचे वर्तमान निर्देशिकाओं से खोज करेगा ।
सुनिश्चित नहीं है कि *जैसे फ़ाइल पैटर्न में मेरी खोज को पुनरावर्ती कैसे करें । C के साथ ही ग्रेप
वर्तमान और सभी उप निर्देशिकाओं में एक स्ट्रिंग के लिए फ़ाइलों को पुनरावर्ती रूप से खोजने के लिए खोज और ग्रेप संयोजन का उपयोग करें । इस जाँच http://wilddiary.com/find-files-containing-my-text/