Come trovare un file di testo che contiene una parola specifica all'interno (non nel suo nome)

97

Voglio trovare un file di testo nel mio hard disk che contiene una parola specifica.

Prima di Ubuntu 12.4 Avevo iniziato nel dash un'applicazione, penso fosse chiamata "Cerca file ...", la cui icona era una lente d'ingrandimento. Non riesco più a trovare quella semplice applicazione.

    
posta SomeoneMe 29.04.2012 - 18:40

6 risposte

159

Puoi usare il comando grep dal terminale:

 grep -r word *

Questo comando troverà tutte le occorrenze di "parola" in tutti i file nella directory corrente (o nelle sottodirectory).

    
risposta data Steve Chapel 29.04.2012 - 18:48
63

Installa gnome-search-tool.

sudo apt-get install gnome-search-tool

Apri Search for files seleziona Select More Options e

risposta data hingev 29.04.2012 - 18:48
4

La domanda è abbastanza vecchia ... comunque ... attualmente (2016) c'è un'app di gnome chiamata tracker (la puoi trovare nei repository di ubuntu) che può essere installata per cercare il testo all'interno dei file (provato odt-ods-odp-pdf). Il pacchetto viene fornito con 4 altri pacchetti da installare (tracker-extract, tracker-gui, tracker-miner-fs, tracker-utils) Namastè:)

    
risposta data cico 14.01.2016 - 01:11
2

Sì, so che stavi cercando un'applicazione GUI e questo è un vecchio post, ma forse questo aiuta qualcuno. Ho trovato util a ack-grep. Inizialmente installarlo tramite sudo apt-get install ack-grep e quindi eseguire il comando ack-grep what_you_looking_for nella directory in cui si desidera cercare. Questo mostra tutti i file in cui è presente il tuo testo e mostra anche l'anteprima da questi file. E questo è molto importante per me.

    
risposta data spajdo 25.02.2016 - 11:38
2

Ecco una panoramica dei diversi metodi che è possibile utilizzare per cercare i file per stringhe di testo specifiche, con alcune opzioni aggiunte appositamente per funzionare solo con file di testo e ignorare i file binari / dell'applicazione.

Si dovrebbe notare, tuttavia, che la ricerca di parole può diventare un po 'complessa, perché la maggior parte degli strumenti di corrispondenza delle linee tenterà di trovare una parola in qualsiasi punto della linea. Se stiamo parlando di una parola come una stringa che potrebbe apparire all'inizio o alla fine della riga, o da sola sulla linea, o circondata da spazi e / o punteggiatura, allora avremo bisogno di espressioni regolari, e specialmente di quelle che verranno da Perl. Qui, ad esempio, possiamo usare -P in grep per utilizzare le espressioni regolari di Perl per circondarlo.

$ 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

Semplice grep

$ grep -rIH  'word'
  • -r per la ricerca ricorsiva in giù dalla directory corrente
  • -I per ignorare i file binari
  • -H per l'output del nome file in cui viene trovata la corrispondenza

Adatto solo alla ricerca.

trova + grep

$ find -type f -exec grep -IH 'word' {} \;
  • find esegue la ricerca ricorsiva
  • L'opzione -I è di ignorare i file binari
  • -H per l'output del nomefile dove si trova la linea
  • buon approccio per combinare con altri comandi all'interno di una subshell, come:

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

grep ricorsivo di poveri-mans in script ricorsivo di bash

Questo è il "modo bash". Non ideale, probabilmente nessuna buona ragione per usarlo quando hai grep o perl installato.

#!/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]"
    
risposta data Sergiy Kolodyazhnyy 11.11.2017 - 19:00
0

Ancora più semplice e veloce è "silver searcher" sudo apt-get install silversearcher-ag . Dai un'occhiata al link per riassicurare perché è migliore di ack *, tra gli altri.

    
risposta data Diego Andrés Díaz Espinoza 08.02.2017 - 17:52

Leggi altre domande sui tag