ऐसी टेक्स्ट फ़ाइल कैसे खोजें जिसमें कोई विशिष्ट शब्द हो (उसके नाम में नहीं)


116

मैं अपनी हार्ड डिस्क में एक पाठ फ़ाइल ढूंढना चाहता हूं जिसमें एक विशिष्ट शब्द हो।

Ubuntu 12.4 से पहले मैं एक एप्लिकेशन को डैश में शुरू करता था, मुझे लगता है कि इसे "फ़ाइल के लिए खोज ..." कहा जाता था, जिसका आइकन एक आवर्धक ग्लास था। मैं उस सरल एप्लिकेशन को और अधिक नहीं पा सकता हूं।

जवाबों:


196

आप grepटर्मिनल से कमांड का उपयोग कर सकते हैं :

 grep -r word *

यह कमांड मौजूदा डायरेक्टरी (या सबड्रेक्ट्रीज़) के तहत सभी फाइलों में "शब्द" की सभी घटनाओं को खोज लेगा।


9
तारांकन छिपी हुई फ़ाइलों से मेल नहीं खाता है। सभी फ़ाइलों को खोजने के लिए आप चला सकते हैं grep -r word .
इयान मैकिनॉन

यदि शेल स्क्रिप्ट से grep कहा जाता है, तो खोज कीवर्ड हाइलाइट किए गए प्रिंट नहीं कर सकता है, लेकिन --color=autoध्वज उसे हल कर सकता है।
noobninja

67

सूक्ति-खोज-उपकरण स्थापित करें।

sudo apt-get install gnome-search-tool

खुला और Search for filesचुनेंSelect More Options


यहां छवि विवरण दर्ज करें


1
क्या आपको यह काम करने के लिए OS को पुनरारंभ करना होगा? या शायद यह 12 में काम नहीं करता है?
jcollum

क्या आपने भाग स्थापित किया है? मुझे पूरा यकीन है कि यह काम करना चाहिए, यह 13.04 पर काम करता है।
हिंगेव

which gnome-search-tool= /usr/bin/gnome-search-tool... लेकिन जब मैं gnome में खोज विकल्प खोलता हूं (जाओ, फ़ाइलों की खोज करें ...) "अधिक विकल्प चुनें" के लिए कोई विकल्प नहीं है
jcollum

1
टर्मिनल में टाइप करके खोलें: gnome-search-toolऔर मुझे यकीन है कि आप इसे देखेंगे।
हिंगेव

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

5

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

हालाँकि, ध्यान देना चाहिए कि शब्द की खोज करने से थोड़ा जटिल हो सकता है, क्योंकि अधिकांश लाइन-मिलान उपकरण लाइन पर कहीं भी एक शब्द खोजने की कोशिश करेंगे। यदि हम एक ऐसे शब्द के बारे में बात कर रहे हैं जो स्ट्रिंग की शुरुआत या अंत में दिखाई दे सकता है, या लाइन पर अकेला, या रिक्त स्थान और / या विराम चिह्न से घिरा हो सकता है - तब जब हमें नियमित अभिव्यक्ति की आवश्यकता होगी, और विशेष रूप से वे जो आते हैं पर्ल से। यहाँ, उदाहरण के लिए, हम उपयोग कर सकते हैं -Pमें grepपर्ल नियमित अभिव्यक्तियों का उपयोग करने के लिए यह चारों ओर।

$ printf "A-well-a don't you know about the bird?\nWell, everybody knows that the bird is a word" | grep -noP '\bbird\b'                                               
1:bird
2:bird

सरल grep

$ grep -rIH  'word'
  • -r वर्तमान निर्देशिका से पुनरावर्ती खोज के लिए
  • -I बाइनरी फ़ाइलों को अनदेखा करने के लिए
  • -H आउटपुट फ़ाइल नाम के लिए जहां मैच पाया जाता है

केवल खोज के लिए उपयुक्त है।

खोज + grep

$ find -type f -exec grep -IH 'word' {} \;
  • find पुनरावर्ती खोज भाग करता है
  • -I विकल्प बाइनरी फ़ाइलों को अनदेखा करना है
  • -H आउटपुट नाम के लिए, जहां लाइन पाई जाती है
  • उपधारा के भीतर अन्य कमांड के साथ संयोजन के लिए अच्छा तरीका, जैसे:

    $ find -type f -exec sh -c 'grep -IHq "word" "$1" && echo "Found in $1"' sh {} \;
    

पर्ल

#!/usr/bin/env perl
use File::Find;
use strict;
use warnings;

sub find_word{
    return unless -f;
    if (open(my $fh, $File::Find::name)){
        while(my $line = <$fh>){
            if ($line =~ /\bword\b/){
                printf "%s\n", $File::Find::name;
                close($fh);
                return;
            }
        }
    }
}

# this assumes we're going down from current working directory
find({ wanted => \&find_word, no_chdir => 1 },".")

गरीब-आदमी पुनरावर्ती बैश स्क्रिप्ट में पुनरावर्ती grep

यह "बैश रास्ता" है। आदर्श नहीं, संभवतः इसका उपयोग करने का कोई अच्छा कारण नहीं है जब आपने इसे स्थापित grepया perlस्थापित किया हो।

#!/usr/bin/env bash
shopt -s globstar
#set -x
grep_line(){
    # note that this is simple pattern matching 
    # If we wanted to search for whole words, we could use
    # word|word\ |\ word|\ word\ )
    # although when we consider punctuation characters as well - it gets more
    # complex
    case "$1" in
        *word*) printf "%s\n" "$2";;
    esac
}
readlines(){
    #  line count variable can be used to output on which line match occured

    #line_count=1
    while IFS= read -r line;
    do
        grep_line "$line" "$filename"
        #line_count=$(($line_count+1))
    done < "$1"
}

is_text_file(){
    # alternatively, mimetype command could be used
    # with *\ text\/* as pattern in case statement
    case "$(file -b --mime-type "$1")" in
        text\/*) return 0;;
        *) return 1;;
    esac
}

main(){
    for filename in ./**/*
    do
        if [ -f "$filename" ] && is_text_file "$filename"
        then
            readlines "$filename"
        fi
    done
}
main "$@"

4

प्रश्न काफी पुराना है ... वैसे भी ... वर्तमान में (2016) एक गनोम ऐप है tracker( जिसे आप इसे ubuntu रिपॉजिटरी में पा सकते हैं) जिसे फ़ाइलों के अंदर पाठ की खोज के लिए इंस्टॉल किया जा सकता है (कोशिश की गई ऑड-ओड-ओड-पीडीएफ) । पैकेज 4 अन्य पैकेजों के साथ आता है (ट्रैकर-एक्सट्रैक्ट, ट्रैकर-गुई, ट्रैकर-माइनर-एफएस, ट्रैकर-बर्तन) नमस्तः :)


ट्रैकर एक अच्छा सॉफ्टवेयर है, लेकिन इसके लिए जरूरी है कि इंडेक्स में पहले से ही उस फाइल के बारे में जानकारी हो, जिसे आप सर्च के साथ हिट करना चाहते हैं। यह Recoll की तुलना में कम संसाधनों का उपयोग करता है, मैं सूचकांक आकार के बारे में निश्चित नहीं हूं। लेकिन अगर आपको किसी विशिष्ट पाठ के साथ एक फ़ाइल की खोज करने की आवश्यकता है और इसे एक gui के साथ करना चाहते हैं, तो सूक्ति-खोज-उपकरण एक सूचकांक के बिना समस्या को हल करता है। यह पिछले Ubuntu संस्करणों में एक डिफ़ॉल्ट ऐप था, मुझे नहीं पता कि उन्होंने इसे बिना प्रतिस्थापन के क्यों हटा दिया।
हाटेरू हंसौ

2

हां, मुझे पता है कि आप गुई आवेदन की तलाश कर रहे थे और यह पुरानी पोस्ट है, लेकिन शायद यह किसी की मदद करे। मैंने ack-grep उपयोग पाया। पहले इसे इंस्टॉल करें sudo apt-get install ack-grepऔर फिर ack-grep what_you_looking_forउस डायरेक्टरी में कमांड चलाएं जहां आप सर्च करना चाहते हैं। यह आपको उन सभी फाइलों को दिखाता है जिनमें आपका पाठ है और इस फाइलों से पूर्वावलोकन भी दिखाते हैं। और यह मेरे लिए बहुत महत्वपूर्ण है।


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