İçinde belirli bir kelimeyi içeren bir metin dosyası nasıl bulunur (isminde değil)

97

Sabit diskimde belirli bir sözcük içeren bir metin dosyası bulmak istiyorum.

Ubuntu 12.4'ten önce, bir uygulamada bir uygulama başlatmak için kullanmıştım, sanırım simgesi "büyüteç" olan "Dosya ara ..." olarak adlandırılıyordu. Artık bu basit uygulamayı bulamıyorum.

    
sordu SomeoneMe 29.04.2012 18:40

6 cevap

159

Terminalden grep komutunu kullanabilirsiniz:

 grep -r word *

Bu komut, geçerli dizinin altındaki (veya alt kayıtların) tüm dosyalarda "kelime" nin tüm oluşumlarını bulacaktır.

    
verilen cevap Steve Chapel 29.04.2012 18:48
63

Gnome arama aracı yükleyin.

sudo apt-get install gnome-search-tool

Search for files öğesini seçin Select More Options öğesini ve

verilen cevap hingev 29.04.2012 18:48
4

Soru oldukça yaşlı ... her neyse ... şu anda (2016) tracker adlı bir gnome uygulaması vardır (ubuntu depolarında bulabilirsiniz) dosyaları içindeki metni aramak için kurulabilir (odt-ods-odp-pdf denedim). Paket, kurulacak 4 paketle birlikte geliyor (tracker-extract, tracker-gui, tracker-miner-fs, tracker-utils) Namastè:)

    
verilen cevap cico 14.01.2016 01:11
2

Evet, gui başvurusu yaptığınızı biliyorum ve bu eski yazı, ama belki bu birilerine yardımcı olabilir. Ack-grep kullananlar buldum. İlk önce sudo apt-get install ack-grep yoluyla yükleyin ve daha sonra arama yapmak istediğiniz dizinde ack-grep what_you_looking_for komutunu çalıştırın. Bu, metninizin olduğu tüm dosyaları gösterir ve ayrıca bu dosyaların önizlemesini gösterir. Ve bu benim için çok önemli.

    
verilen cevap spajdo 25.02.2016 11:38
2

Burada, belirli metin dizileri için dosyaları aramak için kullanılabilecek farklı yöntemlere genel bakış, özellikle metin dosyaları ile çalışmak için birkaç seçenek eklendi ve ikili / uygulama dosyalarını yok saydık.

Bununla birlikte, kelimelerin aranmasının biraz karmaşık olabileceğine dikkat edilmelidir, çünkü çoğu eşleştirme araçları satırın herhangi bir yerinde bir kelime bulmaya çalışacaktır. Eğer satırın başına veya sonuna veya satırda tek başına veya boşluklarla ve / veya noktalama işaretleriyle çevrelenmiş bir kelime dizisinden bahsediyorsak, normal ifadelere ve özellikle de Perl'den. Örneğin, burada, -P değerini grep kullanarak, çevrelemek için Perl düzenli ifadelerini kullanabiliriz.

$ 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

Basit grep

$ grep -rIH  'word'
  • Geçerli dizinden aşağı doğru tekrar arama için -r
  • İkili dosyaları yok saymak için -I
  • Eşleşme bulunduğunda çıktı dosyasının -H çıkışı

Yalnızca arama yapmak için uygundur.

bul + grep

$ find -type f -exec grep -IH 'word' {} \;
  • find , yinelemeli arama bölümünü yapıyor
  • -I seçeneği, ikili dosyaları yok saymaktır
  • Satır bulunduğu dosya adına -H çıkış
  • subshell içindeki diğer komutlarla birleştirmek için iyi bir yaklaşım, örneğin:

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

Perl

#!/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 },".")

yinelemeli bash komut dosyasında zayıf mans yinelemeli grep

Bu "bash yolu". İdeal değil, muhtemelen grep veya perl yüklendiğinde bunu kullanmak için iyi bir neden yok.

#!/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 "" in
        *word*) printf "%s\n" "";;
    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 < ""
}

is_text_file(){
    # alternatively, mimetype command could be used
    # with *\ text\/* as pattern in case statement
    case "$(file -b --mime-type "")" 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 "[email protected]"
    
verilen cevap Sergiy Kolodyazhnyy 11.11.2017 19:00
0

Daha basit ve hızlı, "gümüş arama" sudo apt-get install silversearcher-ag . Neden diğerleri arasında ack * 'den daha iyi olduğu konusunda reassons için İşte ' e bakın.

    
verilen cevap Diego Andrés Díaz Espinoza 08.02.2017 17:52

Etiketlerdeki diğer soruları oku