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


117

Voglio trovare un file di testo nel mio disco rigido che contiene una parola specifica.

Prima di Ubuntu 12.4 ero solito avviare nel trattino un'applicazione, penso che si chiamasse "Cerca file ...", la cui icona era una lente d'ingrandimento. Non riesco più a trovare quella semplice applicazione.

Risposte:


198

È possibile utilizzare il grepcomando dal terminale:

 grep -r word *

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


9
L'asterisco non corrisponde ai file nascosti. Per cercare tutti i file che è possibile eseguire grep -r word ..
Ian Mackinnon,

se grep viene chiamato da uno script di shell, la parola chiave search potrebbe non essere evidenziata, ma il --color=autoflag può risolverlo.
Noobninja,

67

Installa gnome-search-tool.

sudo apt-get install gnome-search-tool

Apri Search for filesseleziona Select More Optionse


inserisci qui la descrizione dell'immagine


1
devi riavviare il sistema operativo per farlo funzionare? o forse non funziona in 12?
jcollum,

hai finito l'installazione parte? Sono abbastanza sicuro che debba funzionare, funziona il 13.04.
hingev,

which gnome-search-tool= /usr/bin/gnome-search-tool... ma quando apro l'opzione di ricerca in gnome (Vai, Cerca file ...) non c'è alcuna opzione per "Seleziona più opzioni"
jcollum,

1
apri digitando nel terminale: gnome-search-toole sono sicuro che lo vedrai.
hingev,

Puoi avviare gnome-search-tool tramite il trattino "Cerca file", quindi non hai bisogno del terminale.
Bernard Decock,

6

Ecco una panoramica dei diversi metodi che è possibile utilizzare per cercare file per stringhe di testo specifiche, con alcune opzioni aggiunte in modo specifico per lavorare solo con file di testo e ignorare i file binari / applicativi.

Si dovrebbe notare, tuttavia, che la ricerca di parole può diventare un po 'complessa, poiché 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 stringa che potrebbe apparire all'inizio o alla fine della linea, o da sola sulla linea, o circondata da spazi e / o punteggiatura - è allora che avremo bisogno di espressioni regolari, e specialmente di quelle che vengono dal Perl. Qui, per esempio, possiamo usare -Pin grepper usare le espressioni regolari del 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

Grep semplice

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

Adatto solo per la ricerca.

trova + grep

$ find -type f -exec grep -IH 'word' {} \;
  • find fa la parte di ricerca ricorsiva
  • -I l'opzione è di ignorare i file binari
  • -H per generare il nome del file dove si trova la linea
  • buon approccio per la combinazione con altri comandi all'interno di subshell, come:

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

grep ricorsivo mans-mans in script bash ricorsivo

Questa è la "via bash". Non è l'ideale, probabilmente non c'è una buona ragione per usarlo quando lo hai installato grepo perlinstallato.

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

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


Tracker è un buon software ma richiede che l'indice contenga già informazioni sul file che ti interessa per colpirlo con una ricerca. Utilizza meno risorse di Recoll, non sono sicuro della dimensione dell'indice. Ma se hai bisogno di cercare un file con un testo specifico e vuoi farlo con una gui, gnome-search-tool risolve il problema senza un indice. Era un'app predefinita nelle precedenti versioni di Ubuntu, non so perché l'hanno rimossa senza una sostituzione.
Hatoru Hansou,

2

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


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.