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

97

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

Vor Ubuntu 12.4 habe ich im Dash eine Anwendung gestartet, ich glaube, sie hieß "Suche nach Datei ...", deren Icon ein Vergrößerungsglas war. Ich kann diese einfache Anwendung nicht mehr finden.

    
SomeoneMe 29.04.2012, 18:40
quelle

6 Antworten

159

Sie können den Befehl grep von terminal:

verwenden
 grep -r word *

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

    
Steve Chapel 29.04.2012 18:48
quelle
63

Installieren Sie gnome-search-tool.

sudo apt-get install gnome-search-tool

Öffnen Sie Search for files wählen Sie Select More Options und

hingev 29.04.2012 18:48
quelle
4

Die Frage ist ziemlich alt ... wie auch immer ... derzeit (2016) gibt es eine Gnome-App namens tracker (Sie können es in ubuntu-Repositories finden), 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-Extrakt, Tracker-GUI, Tracker-Miner-FS, Tracker-Utils) Namastè:)

    
cico 14.01.2016 01:11
quelle
2

Ja, ich weiß, dass Sie nach einer GUI-Anwendung gesucht haben, und das ist ein alter Post, aber vielleicht hilft das jemandem. Ich habe ack-grep util gefunden. Installieren Sie es zunächst über sudo apt-get install ack-grep und führen Sie anschließend den Befehl ack-grep what_you_looking_for in dem Verzeichnis aus, in dem Sie suchen möchten. Dies zeigt Ihnen alle Dateien in denen sich Ihr Text befindet und zeigen auch eine Vorschau von diesen Dateien an. Und das ist so wichtig für mich.

    
spajdo 25.02.2016 11:38
quelle
2

Hier ist ein Überblick über verschiedene Methoden, mit denen man Dateien nach bestimmten Textzeichenfolgen durchsuchen kann, mit einigen Optionen, die speziell hinzugefügt wurden, um nur mit Textdateien zu arbeiten, und Binär- / Anwendungsdateien zu ignorieren.

Man sollte jedoch beachten, dass die Suche nach einem Wort ein wenig komplex werden kann, da die meisten Zeilenabgleich-Tools versuchen werden, irgendwo auf der Zeile ein Wort zu finden. Wenn wir über ein Wort als Zeichenfolge sprechen, die am Anfang oder am Ende der Zeile oder alleine in der Zeile oder von Leerzeichen und / oder Interpunktion umgeben sein kann - dann brauchen wir reguläre Ausdrücke, und vor allem solche, die kommen von Perl. Hier können wir zum Beispiel -P in grep verwenden, um die regulären Perl-Ausdrücke zu verwenden.

$ 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 , um Binärdateien zu ignorieren
  • -H , um den Dateinamen auszugeben, wo Übereinstimmung gefunden wird

Nur für die Suche geeignet.

finde + grep

$ find -type f -exec grep -IH 'word' {} \;
  • find macht den rekursiven Suchteil
  • Die Option -I ignoriert Binärdateien
  • -H , um den Dateinamen auszugeben, in dem die Zeile gefunden wurde
  • guter Ansatz für die Kombination mit anderen Befehlen innerhalb der Subshell, wie:

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

rekursives grep in rekursivem Bash-Skript

Dies ist der "Bash Way". Nicht ideal, wahrscheinlich kein guter Grund, dies zu verwenden, wenn Sie grep oder perl installiert haben.

#!/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 "$@"
    
Sergiy Kolodyazhnyy 11.11.2017 19:00
quelle
0

Noch einfacher und schneller ist "Silver Sucher" sudo apt-get install silversearcher-ag . Sehen Sie sich lien an, um zu erfahren, warum es unter anderem besser ist als ack *.

    
quelle

Tags und Links