Jak znaleźć plik tekstowy zawierający w środku określone słowo (nie w nazwie)


116

Chcę znaleźć plik tekstowy na dysku twardym, który zawiera określone słowo.

Przed Ubuntu 12.4 uruchamiałem w desce rozdzielczej aplikację, myślę, że nazywała się „Wyszukaj plik ...”, której ikoną było szkło powiększające. Nie mogę już znaleźć tej prostej aplikacji.

Odpowiedzi:


196

Możesz użyć greppolecenia z terminala:

 grep -r word *

To polecenie znajdzie wszystkie wystąpienia „słowa” we wszystkich plikach w bieżącym katalogu (lub podkatalogach).


9
Gwiazdka nie pasuje do ukrytych plików. Aby wyszukać wszystkie pliki, które możesz uruchomić grep -r word ..
Ian Mackinnon

jeśli grep jest wywoływany ze skryptu powłoki, słowo kluczowe wyszukiwania może nie być drukowane podświetlone, ale --color=autoflaga może to rozwiązać.
noobninja

67

Zainstaluj narzędzie wyszukiwania gnome.

sudo apt-get install gnome-search-tool

Otwórz Search for fileswybierz Select More Optionsi


wprowadź opis zdjęcia tutaj


1
czy musisz ponownie uruchomić system operacyjny, aby to zadziałało? a może nie działa w 12?
jcollum 18.04.13

skończyłeś instalować część? Jestem pewien, że to musi działać, działa 13.04.
hingev

which gnome-search-tool= /usr/bin/gnome-search-tool... ale kiedy otworzę opcję wyszukiwania w gnome (Idź, wyszukaj pliki ...) nie ma opcji dla „Wybierz więcej opcji”
jcollum

1
otwórz, wpisując terminal: gnome-search-tooli jestem pewien, że to zobaczysz.
hingev

Możesz uruchomić narzędzie do wyszukiwania gnome za pomocą myślnika „Wyszukaj pliki”, więc nie potrzebujesz terminalu.
Bernard Decock

5

Oto przegląd różnych metod przeszukiwania plików pod kątem określonych ciągów tekstowych, z kilkoma dodanymi opcjami specjalnie do pracy tylko z plikami tekstowymi i ignorowania plików binarnych / aplikacji.

Należy jednak zauważyć, że wyszukiwanie słowa może być nieco skomplikowane, ponieważ większość narzędzi do dopasowywania wierszy spróbuje znaleźć słowo w dowolnym miejscu linii. Jeśli mówimy o słowie jako ciągu, który może pojawić się na początku lub na końcu wiersza, sam w wierszu lub otoczony spacjami i / lub znakami interpunkcyjnymi - wtedy potrzebujemy wyrażeń regularnych, a zwłaszcza tych, które przychodzą z Perla. Oto, na przykład, możemy użyć -Pw grepcelu wykorzystania wyrażeń regularnych Perl go otaczają.

$ 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

Proste grep

$ grep -rIH  'word'
  • -r do wyszukiwania rekurencyjnego w dół z bieżącego katalogu
  • -I ignorować pliki binarne
  • -H wypisać nazwę pliku, w którym znaleziono dopasowanie

Nadaje się tylko do wyszukiwania.

znajdź + grep

$ find -type f -exec grep -IH 'word' {} \;
  • find wykonuje część wyszukiwania rekurencyjnego
  • -I opcja polega na ignorowaniu plików binarnych
  • -H wypisać nazwę pliku, w którym znajduje się linia
  • dobre podejście do łączenia z innymi poleceniami w podpowłoce, takimi jak:

    $ 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 },".")

poor-mans rekursywny grep w rekurencyjnym skrypcie bash

To jest „bash way”. Nie jest to idealny, prawdopodobnie nie ma dobrego powodu, aby używać tego, gdy masz greplub perlinstalujesz.

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

Pytanie jest dość stare ... w każdym razie ... obecnie (2016) istnieje aplikacja gnome o nazwie tracker(można ją znaleźć w repozytoriach ubuntu), którą można zainstalować w celu wyszukiwania tekstu w plikach (wypróbowano odt-ods-odp-pdf) . Pakiet zawiera 4 inne pakiety do zainstalowania (tracker-ekstrakt, tracker-gui, tracker-miner-fs, tracker-utils) Namastè :)


Tracker to dobre oprogramowanie, ale wymaga, aby indeks zawierał już informacje o pliku, który chcesz trafić w wynik wyszukiwania. Zużywa mniej zasobów niż Recoll, nie jestem pewien co do wielkości indeksu. Ale jeśli chcesz przeszukać plik z określonym tekstem i chcesz to zrobić za pomocą GUI, narzędzie wyszukiwania gnome rozwiązuje problem bez indeksu. Była to domyślna aplikacja w poprzednich wersjach Ubuntu, nie wiem, dlaczego usunęli ją bez zamiany.
Hatoru Hansou

2

Tak, wiem, że szukałeś aplikacji GUI i to jest stary post, ale może to komuś pomoże. Znalazłem ack-grep. Najpierw zainstaluj go, sudo apt-get install ack-grepa następnie uruchom polecenie ack-grep what_you_looking_forw katalogu, w którym chcesz wyszukać. To pokazuje wszystkie pliki, w których znajduje się tekst, a także pokazuje podgląd tych plików. I to jest dla mnie bardzo ważne.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.