linux - मैं लिनक्स पर विशिष्ट पाठ वाली सभी फाइलें कैसे ढूंढूं?




text grep (20)

मैं लिनक्स पर विशिष्ट पाठ वाली सभी फाइलें कैसे ढूंढूं? (...)

मैं इस समाधान में दो बार आया था:

find / -type f -exec grep -H 'text-to-find-here' {} \;

यदि आपके उदाहरण में find का उपयोग करना है, तो grep द्वारा जारी किए गए संदेशों से इनकार करने से इनकार करने के लिए आदेश के अंत में grep लिए बेहतर ऐड -s ( --no-messages ), और 2>/dev/null को grep और find :

grep -RIl "" .

फ़ाइलों को find के लिए मानक उपकरण ढूंढें - विशिष्ट पाठ की तलाश करते समय grep के साथ संयुक्त - यूनिक्स-जैसे प्लेटफार्मों पर। find कमांड अक्सर रास्ते में xargs के साथ संयुक्त होता है।

एक ही उद्देश्य के लिए तेज़ और आसान उपकरण मौजूद हैं - नीचे देखें। बेहतर प्रयास करें, बशर्ते वे आपके प्लेटफ़ॉर्म पर उपलब्ध हों , बेशक:

तेज और आसान विकल्प

ripgrep - चारों ओर सबसे तेज़ खोज उपकरण:

find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null

रजत खोजक :

rg 'text-to-find-here' / -l

ack :

ag 'text-to-find-here' / -l

नोट: आप कई आदेश संदेशों को छिपाने के लिए, इन आदेशों के साथ-साथ 2>/dev/null भी जोड़ सकते हैं।

चेतावनी : जब तक कि आप वास्तव में इससे बच नहीं सकते हैं, एक लंबी और अक्षम खोज से बचने के लिए '/' (रूट निर्देशिका) से खोज न करें! तो उपर्युक्त उदाहरणों में, आप बेहतर रूप से ' / ' को उप-निर्देशिका नाम से बदल देंगे, उदाहरण के लिए "/ home" जहां आप वास्तव में खोजना चाहते हैं ...

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

जब मैं देख रहा था कि यह कैसे करना है, तो मैं इस समाधान में दो बार आया:

find / -type f -exec grep -H 'text-to-find-here' {} \;

हालांकि, यह काम नहीं करता है। ऐसा लगता है कि सिस्टम में हर एक फाइल प्रदर्शित होती है।

क्या यह करने के लिए उचित तरीके से यह है? यदि नहीं, तो मुझे कैसे चाहिए? फाइलों में पाठ तारों को खोजने की यह क्षमता कुछ प्रोग्रामिंग परियोजनाओं के लिए असाधारण रूप से उपयोगी होगी जो मैं कर रहा हूं।


दिए गए पाठ वाले फ़ाइल नामों की सूची

सबसे पहले, मुझे विश्वास है कि आपने -l बजाय -H उपयोग किया है। इसके अलावा आप {} \ बाद उद्धरण के अंदर पाठ जोड़ने का प्रयास कर सकते हैं।

find / -type f -exec grep -l "text-to-find-here" {} \; 

उदाहरण

आइए मान लें कि आप अपनी निर्देशिका के अंदर विशिष्ट टेक्स्ट "अपाचे लाइसेंस" वाली फाइलों की खोज कर रहे हैं। यह परिणाम कुछ हद तक समान प्रदर्शित करेगा (आउटपुट आपकी निर्देशिका सामग्री के आधार पर अलग होगा)।

bash-4.1$ find . -type f -exec grep -l "Apache License" {} \; 
./net/java/jvnet-parent/5/jvnet-parent-5.pom
./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom
./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom
./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom
./commons-codec/commons-codec/1.9/commons-codec-1.9.pom
./commons-io/commons-io/2.4/commons-io-2.4.pom
bash-4.1$ 

केस संवेदनशीलता हटाएं

यहां तक ​​कि यदि आप "टेक्स्ट" बनाम "टेक्स्ट" जैसे मामले के बारे में उपयोग नहीं करते हैं, तो आप मामले को अनदेखा करने के लिए -i स्विच का उपयोग कर सकते हैं। आप here और विवरण पढ़ सकते हैं।

उम्मीद है कि यह आपकी मदद करता है।


आप ack उपयोग कर सकते हैं। यह स्रोत कोड के लिए grep की तरह है। आप इसके साथ अपनी पूरी फाइल सिस्टम स्कैन कर सकते हैं।

बस करो:

ack 'text-to-find-here'

आपकी मूल निर्देशिका में।

आप नियमित अभिव्यक्तियों का भी उपयोग कर सकते हैं, फ़ाइल प्रकार निर्दिष्ट कर सकते हैं आदि।

अद्यतन करें

मैंने अभी सिल्वर सर्चर की खोज की है , जो कि एक की तरह है लेकिन 3-5x तेज है और यहां तक ​​कि एक .gitignore फ़ाइल से पैटर्न को अनदेखा करता है।


आप grep -ilR उपयोग कर सकते हैं:

grep -Ril "text-to-find-here" /
  • i अनदेखा मामले (आपके मामले में वैकल्पिक) के लिए खड़ा है।
  • R रिकर्सिव के लिए खड़ा है।
  • l "फ़ाइल नाम दिखाता हूं, परिणाम न ही" के लिए खड़ा है।
  • / आपकी मशीन की जड़ से शुरू करने के लिए खड़ा है।

आप उपयोग कर सकते हैं:

grep -r "string to be searched"  /path/to/dir

r रिकर्सिव के लिए खड़ा है और इसलिए निर्दिष्ट पथ और इसकी उप-निर्देशिकाओं में भी खोज करेगा। यह आपको फ़ाइल नाम बताएगा और साथ ही फ़ाइल में पंक्ति को प्रिंट करेगा जहां स्ट्रिंग दिखाई देगी।

या आप जिस कोशिश कर रहे हैं उसके समान एक आदेश (उदाहरण:) सभी जावास्क्रिप्ट फ़ाइलों (* .js) में खोज के लिए:

find . -name '*.js' -exec grep -i 'string to search for' {} \; -print

यह उन फ़ाइलों में लाइनों को प्रिंट करेगा जहां टेक्स्ट दिखाई देता है, लेकिन यह फ़ाइल नाम मुद्रित नहीं करता है।

इस कमांड के अलावा, हम इसे भी लिख सकते हैं: grep -rn "खोज करने के लिए स्ट्रिंग" / पथ / से / निर्देशिका / या / file -r: रिकर्सिव सर्च एन: लाइन नंबर मैचों के लिए दिखाया जाएगा


उपयोग:

grep -c Your_Pattern *

यह रिपोर्ट करेगा कि वर्तमान निर्देशिका में प्रत्येक फाइल में आपके पैटर्न की कितनी प्रतियां हैं।


एक सरल find आसान काम कर सकते हैं। यह आपके ~/.bashrc फ़ाइल में उपनाम है:

alias ffind find / -type f | xargs grep

एक नया टर्मिनल शुरू करें और जारी करें:

ffind 'text-to-find-here'

निम्न कार्य करें:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r या -R रिकर्सिव है,
  • -n लाइन संख्या है, और
  • -w पूरे शब्द से मेल खाता है।
  • -l (लोअर-केस एल) को मिलान करने वाली फाइलों का फ़ाइल नाम देने के लिए जोड़ा जा सकता है।

इनके साथ-साथ, --include --exclude , --include , --include --exclude-dir झंडे कुशल खोज के लिए उपयोग किया जा सकता है:

  • यह केवल उन फ़ाइलों के माध्यम से खोजेगा जिनमें .c या .h एक्सटेंशन हैं:

    grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
    
  • यह .o एक्सटेंशन के साथ समाप्त होने वाली सभी फ़ाइलों को खोजने से बाहर कर देगा:

    grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
    
  • निर्देशिकाओं के लिए --exclude-dir पैरामीटर के माध्यम से एक विशेष निर्देशिका (ies) को बाहर करना संभव है। उदाहरण के लिए, यह dirs dir1 /, dir2 / और उन सभी को मिलान करेगा * .dst /:

    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
    

यह आपके लिए लगभग उसी उद्देश्य को प्राप्त करने के लिए, मेरे लिए बहुत अच्छा काम करता है।

अधिक विकल्पों के लिए man grep जांच करें।


प्रयत्न:

find . -name "*.txt" | xargs grep -i "text_pattern"

प्रयत्न:

find / -type f -exec grep -H 'text-to-find-here' {} \;

जो सभी फाइल सिस्टम खोजेगा, क्योंकि रूट फ़ोल्डर है।

घर फ़ोल्डर के उपयोग के लिए:

find ~/ -type f -exec grep -H 'text-to-find-here' {} \;

वर्तमान फ़ोल्डर के उपयोग के लिए:

find ./ -type f -exec grep -H 'text-to-find-here' {} \;

यहां कमांड की कई सूची दी गई हैं जिन्हें फ़ाइल खोजने के लिए उपयोग किया जा सकता है।

grep "text string to search” directory-path

grep [option] "text string to search” directory-path

grep -r "text string to search” directory-path

grep -r -H "text string to search” directory-path

egrep -R "word-1|word-2” directory-path

egrep -w -R "word-1|word-2” directory-path

grep का उपयोग तब भी किया जा सकता है जब हम स्ट्रिंग की तलाश नहीं कर रहे हों।

बस चल रहा है,

ack 'text-to-find-here' / -l

सभी पाठ फ़ाइलों के पथ को मुद्रित करेगा, यानी केवल प्रिंट करने योग्य वर्ण वाले लोग।


grep यह हासिल करने के लिए आपका अच्छा दोस्त है।

grep -r <text_fo_find> <directory>

यदि आपको खोजने के लिए पाठ के मामले की परवाह नहीं है तो उपयोग करें

grep -ir <text_to_find> <directory>

इसे इस्तेमाल करे:

find . | xargs grep 'word' -sl

नीचे दिए गए आदेश इस दृष्टिकोण के लिए ठीक काम करेंगे:

find ./ -name "file_pattern_name"  -exec grep -r "pattern" {} \;

मैं इस बात से मोहक हूं कि grep इसे 'आरएल' के साथ कैसे बनाता है

grep -rl 'pattern_to_find' /path/where/to/find

-r to find recursively file / directory inside directories..
-l to list files matching the 'pattern'

फ़ाइल नामों को देखने के लिए 'l' के बिना '-r' का प्रयोग करें जिसके बाद पैटर्न पाया जाता है !

grep -r 'pattern_to_find' /path/where/to/find

बिल्कुल सही काम करता है ..

आशा करता हूँ की ये काम करेगा!


एक ऐसा ackउपकरण है जो आप जो भी खोज रहे हैं वह ठीक करेगा।

http://linux.die.net/man/1/ack

ack -i search_string folder_path/*

आप -iकेस संवेदनशील खोज के लिए अनदेखा कर सकते हैं


परेशानी से बचें और एके-जीईपी स्थापित करें। यह बहुत सारी अनुमति और उद्धरण मुद्दों को समाप्त करता है।

apt-get install ack-grep

फिर उस निर्देशिका पर जाएं जिसे आप खोजना चाहते हैं और नीचे दिए गए आदेश को चलाएं

cd /
ack-grep "find my keyword"

सभी पिछले उत्तरों grep और खोजने का सुझाव देते हैं। लेकिन एक और तरीका है: मध्यरात्रि कमांडर का प्रयोग करें

यह एक मुफ्त उपयोगिता है (30 साल पुराना, समय के साथ साबित) जो जीयूआई के बिना दृश्य है। बहुत सारे काम हैं, फाइल ढूंढना उनमें से एक है।


find /path -type f -exec grep -l "string" {} \;

टिप्पणियों से स्पष्टीकरण

ढूंढें एक ऐसा आदेश है जो आपको किसी दिए गए पथ की उप-निर्देशिकाओं में निर्देशिकाओं और लिंक जैसी फ़ाइलों और अन्य ऑब्जेक्ट्स खोजने देता है। यदि आप एक मुखौटा निर्दिष्ट नहीं करते हैं कि फाइलनामों को पूरा करना चाहिए, तो यह सभी निर्देशिका वस्तुओं को समझाता है।

-type f specifies that it should proceed only files, not directories etc.
-exec grep specifies that for every found file, it should run grep command, passing its filename as an argument to it, by replacing {} with the filename





find