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


117

Sabit diskimdeki belirli bir kelimeyi içeren bir metin dosyası bulmak istiyorum.

Ubuntu 12.4'ten önce çizgi uygulamasında bir uygulamaya başlardım, sanırım simgesi büyüteç olarak adlandırılan "Dosya ara ..." deniyordu. Artık bu basit uygulamayı bulamıyorum.

Yanıtlar:


198

grepKomutu terminalden kullanabilirsiniz :

 grep -r word *

Bu komut, geçerli dizinin (veya alt dizinlerin) altındaki tüm dosyalardaki "word" kelimelerinin tüm oluşumlarını bulacaktır.


9
Yıldız işareti gizli dosyalarla eşleşmiyor. Tüm dosyaları aramak için çalıştırabilirsiniz grep -r word ..
Ian Mackinnon

grep bir kabuk betiğinden çağrılırsa, arama anahtar sözcüğü vurgulanmış olarak yazdırılmayabilir, ancak --color=autobayrak bunu çözebilir.
noobninja

67

GNOME arama aracını kurun.

sudo apt-get install gnome-search-tool

Search for filesSeç Select More Optionsve aç


görüntü tanımını buraya girin


1
Bunun çalışması için işletim sistemini yeniden başlatmanız gerekiyor mu? ya da belki 12'de çalışmıyor?
jcollum

bölümü yükle yaptın mı? Çalışması gerektiğine eminim, 13.04'te çalışıyor.
hingev

which gnome-search-tool= /usr/bin/gnome-search-tool... ama
gnome'daki

1
terminale yazarak açın: gnome-search-toolve göreceğinize eminim.
hingev

Gnome-arama aracını "Dosya Ara" satırıyla başlatabilirsiniz, böylece terminale ihtiyacınız olmaz.
Bernard Decock

6

Aşağıda, yalnızca metin dosyalarıyla çalışmak için özel olarak eklenmiş birkaç seçenekle, belirli metin dizeleri için dosya aramak için kullanılabilecek farklı yöntemlere genel bir bakış ve ikili / uygulama dosyalarını yoksaymak.

Bununla birlikte, kelime aramanın biraz karmaşık olabileceğine dikkat edilmelidir, çünkü çoğu satır eşleştirme aracı satırın herhangi bir yerinde bir kelime bulmaya çalışır. Satır başında veya sonunda veya satırda tek başına veya boşluklarla ve / veya noktalama işaretleriyle çevrelenmiş bir dize olarak bir kelimeden bahsediyorsak - o zaman düzenli ifadelere ve özellikle de gelenlere ihtiyaç duyarız. Perl. Burada, örneğin, kullanabileceğimiz -Piçinde greponu çevreleyecek Perl düzenli ifadeler yararlanmak.

$ 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'
  • -r Geçerli dizinden özyinelemeli arama için
  • -I ikili dosyaları yoksaymak
  • -H eşleşmenin bulunduğu dosya adını çıkarmak

Sadece arama yapmak için uygundur.

bul + grep

$ find -type f -exec grep -IH 'word' {} \;
  • find özyinelemeli arama bölümünü yapar
  • -I seçenek ikili dosyaları yoksaymaktır
  • -H satırın bulunduğu dosyanın adını çıkarmak
  • deniz kabuğu içindeki diğer komutlarla birleştirmek için iyi bir yaklaşım, örneğin:

    $ find -type f -exec sh -c 'grep -IHq "word" "$1" && echo "Found in $1"' 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 },".")

özyinelemeli bash betiğinde yoksul adamın özyinelemeli grep

Bu "bash yoludur". İdeal değil, muhtemelen kurduğunuzda grepveya perlkurduğunuzda bunu kullanmak için iyi bir neden yoktur .

#!/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

Soru oldukça eski ... her neyse ... şu anda (2016) trackerdosyalarda metin aramak için kurulabilen (ubuntu depolarında bulabilirsiniz) adında bir gnome uygulaması var (odt-ods-odp-pdf denendi) . Paket, kurulacak 4 başka paketle birlikte gelir (tracker-extract, tracker-gui, tracker-miner-fs, tracker-utils) Namastè :)


İzleyici iyi bir yazılımdır ancak endekste arama yapmak istediğiniz dosya hakkında bilgi içermesini gerektirir. Recoll'dan daha az kaynak kullanıyor, indeks boyutundan emin değilim. Ancak, belirli bir metin içeren bir dosyayı aramanız ve bir gui ile yapmak istemeniz durumunda, gnome-search-tool, sorunu bir dizin olmadan çözer. Önceki Ubuntu sürümlerinde varsayılan bir uygulamaydı, neden değiştirmeden kaldırdıklarını bilmiyorum.
Hatoru Hansou

2

Evet, GUI uygulamasını aradığınızı biliyorum ve bu eski bir yazı, ama belki bu birisi yardımcı olabilir. Ack-grep util buldum. İlk önce onu kurun sudo apt-get install ack-grepve sonra ack-grep what_you_looking_forarama yapmak istediğiniz dizinde komutu çalıştırın . Bu, metninizdeki tüm dosyaları gösterir ve ayrıca bu dosyaların önizlemesini gösterir. Ve bu benim için çok önemli.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.