So finden Sie eine Textdatei, die ein bestimmtes Wort enthält (nicht im Namen)

117

Ich möchte eine Textdatei auf meiner Festplatte finden, die ein bestimmtes Wort enthält.

Vor Ubuntu 12.4 habe ich eine Anwendung im Bindestrich gestartet. Ich glaube, sie hieß "Nach Datei suchen ...", deren Symbol eine Lupe war. Ich kann diese einfache Anwendung nicht mehr finden.

Jemand
quelle

Antworten:

198

Sie können den grepBefehl vom Terminal aus verwenden:

 grep -r word *

Dieser Befehl findet alle Vorkommen von "word" in allen Dateien im aktuellen Verzeichnis (oder in den Unterverzeichnissen).

Steve Chapel
quelle
9
Das Sternchen stimmt nicht mit versteckten Dateien überein. Um alle Dateien zu durchsuchen, die Sie ausführen können grep -r word ..
Ian Mackinnon
Wenn grep von einem Shell-Skript aufgerufen wird, wird das Suchwort möglicherweise nicht hervorgehoben gedruckt, aber das --color=autoFlag kann das beheben.
Noobninja
67

Installieren Sie das Gnome-Search-Tool.

sudo apt-get install gnome-search-tool

Öffnen Sie Search for filesselect Select More Optionsund


Bildbeschreibung hier eingeben

hingev
quelle
1
Müssen Sie das Betriebssystem neu starten, damit dies funktioniert? oder vielleicht klappt es in 12 nicht?
jcollum
Hast du das Teil installiert? Ich bin mir ziemlich sicher, dass es funktionieren muss, es funktioniert am 13.04.
hingev
which gnome-search-tool= /usr/bin/gnome-search-tool... aber wenn ich die Suchoption in gnome öffne (Gehe zu,
Nach
1
Öffnen Sie, indem Sie im Terminal eingeben: gnome-search-toolund ich bin sicher, Sie werden es sehen.
hingev
Sie können gnome-search-tool über den Bindestrich "Nach Dateien suchen" starten, so dass Sie das Terminal nicht benötigen.
Bernard Decock
6

Im Folgenden finden Sie eine Übersicht über verschiedene Methoden, mit denen Sie Dateien nach bestimmten Textzeichenfolgen durchsuchen können. Einige Optionen wurden hinzugefügt, um nur mit Textdateien zu arbeiten und Binär- / Anwendungsdateien zu ignorieren.

Man sollte jedoch beachten, dass das Suchen nach Wörtern etwas komplex werden kann, da die meisten Tools zur Zeilenanpassung versuchen, ein Wort an einer beliebigen Stelle in der Zeile zu finden. Wenn es sich um ein Wort als Zeichenfolge handelt, das am Anfang oder Ende einer Zeile oder allein in der Zeile oder umgeben von Leerzeichen und / oder Interpunktionszeichen vorkommen kann, benötigen wir reguläre Ausdrücke, insbesondere solche, die kommen von Perl. Hier können zum Beispiel verwenden wir -Pin grepzur Verwendung von Perl reguläre Ausdrücke zu machen , um sie zu umgeben.

$ 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

Einfaches Grep

$ grep -rIH  'word'
  • -r für die rekursive Suche aus dem aktuellen Verzeichnis
  • -I Binärdateien zu ignorieren
  • -H um den Dateinamen auszugeben, in dem die Übereinstimmung gefunden wurde

Nur zum Suchen geeignet.

find + grep

$ find -type f -exec grep -IH 'word' {} \;
  • find erledigt die rekursive Suche
  • -I Option ist, Binärdateien zu ignorieren
  • -H um den Dateinamen auszugeben, in dem die Zeile gefunden wurde
  • guter Ansatz zum Kombinieren mit anderen Befehlen in der Subshell, wie:

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

Armenmanns rekursives Grep in rekursivem Bash-Skript

Dies ist der "Bash-Weg". Nicht ideal, wahrscheinlich kein guter Grund , dies zu verwenden , wenn Sie haben grepoder perlinstalliert.

#!/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 "$@"
Sergiy Kolodyazhnyy
quelle
4

Die Frage ist ziemlich alt ... jedenfalls ... derzeit (2016) gibt es eine Gnome-App mit dem Namen tracker(Sie finden sie in Ubuntu-Repositories), die installiert werden kann, um nach Text in Dateien zu suchen (versucht, odt-ods-odp-pdf). . Das Paket enthält 4 weitere zu installierende Pakete (tracker-extract, tracker-gui, tracker-miner-fs, tracker-utils) Namastè :)

cico
quelle
Tracker ist eine gute Software, aber der Index muss bereits Informationen zu der Datei enthalten, die Sie bei einer Suche finden möchten. Es verbraucht weniger Ressourcen als Recoll. Ich bin mir nicht sicher, wie groß der Index ist. Wenn Sie jedoch eine Datei mit einem bestimmten Text suchen müssen und dies mit einer GUI tun möchten, löst das Gnome-Search-Tool das Problem ohne Index. Es war eine Standard-App in früheren Ubuntu-Versionen, ich weiß nicht, warum sie es ersatzlos entfernt haben.
Hatoru Hansou
2

Ja, ich weiß, dass Sie nach einer GUI-Anwendung gesucht haben und dies ist ein alter Beitrag, aber vielleicht hilft dies jemandem. Ich habe ack-grep util gefunden. Zuerst installieren Sie es über sudo apt-get install ack-grepund führen dann den Befehl ack-grep what_you_looking_forin dem Verzeichnis aus, in dem Sie suchen möchten. Hier sehen Sie alle Dateien, in denen sich Ihr Text befindet, und eine Vorschau dieser Dateien. Und das ist so wichtig für mich.

spajdo
quelle
0

Noch einfacher und schneller ist "Silver Searcher" sudo apt-get install silversearcher-ag. Schauen Sie unter https://github.com/ggreer/the_silver_searcher nach, um zu erfahren, warum dies unter anderem besser ist als ack *.

Diego Andrés Díaz Espinoza
quelle