Como encontrar um arquivo de texto que contenha uma palavra específica (não no nome)

117

Quero encontrar um arquivo de texto no meu disco rígido que contenha uma palavra específica.

Antes do Ubuntu 12.4, eu costumava iniciar no painel um aplicativo, acho que ele se chamava "Procurar arquivo ...", cujo ícone era uma lupa. Não consigo mais encontrar esse aplicativo simples.

SomeoneMe
fonte

Respostas:

198

Você pode usar o grepcomando do terminal:

 grep -r word *

Este comando encontrará todas as ocorrências de "word" em todos os arquivos no diretório atual (ou sub-diretórios).

Steve Chapel
fonte
9
O asterisco não corresponde aos arquivos ocultos. Para pesquisar todos os arquivos que você pode executar grep -r word ..
precisa
se grep for chamado a partir de um script de shell, a palavra-chave de pesquisa poderá não ser impressa em destaque, mas o --color=autosinalizador poderá resolver isso.
precisa saber é o seguinte
67

Instale a ferramenta de pesquisa do gnome.

sudo apt-get install gnome-search-tool

Abra Search for filesselecionar Select More Optionse


insira a descrição da imagem aqui

hingev
fonte
1
você precisa reiniciar o sistema operacional para que isso funcione? ou talvez não funcione em 12?
Jcollum #
você já instalou parte? Tenho certeza de que deve funcionar, funciona na 13.04.
hingev
which gnome-search-tool= /usr/bin/gnome-search-tool... mas quando eu abrir a opção de pesquisa no gnome (Vá, Pesquisar arquivos ...) não há nenhuma opção para "Selecionar Mais Opções"
jcollum
1
abra digitando no terminal: gnome-search-toole tenho certeza que você o verá.
hingev
Você pode iniciar o gnome-search-tool através do painel "Pesquisar arquivos", para não precisar do terminal.
Bernard Decock
6

Aqui está uma visão geral dos diferentes métodos que se pode usar para pesquisar arquivos por sequências de texto específicas, com algumas opções adicionadas especificamente para trabalhar apenas com arquivos de texto e ignorar arquivos binários / de aplicativos.

Deve-se notar, no entanto, que a busca por palavras pode se tornar um pouco complexa, porque a maioria das ferramentas de correspondência de linhas tentará encontrar uma palavra em qualquer lugar da linha. Se estamos falando de uma palavra como string que pode aparecer no início ou no final da linha, ou sozinha na linha, ou cercada por espaços e / ou pontuação - é quando precisaremos de expressões regulares e, especialmente, as que vierem de Perl. Aqui, por exemplo, podemos usar -Pem grepfazer uso de expressões regulares Perl para cercá-lo.

$ 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 simples

$ grep -rIH  'word'
  • -r para pesquisa recursiva no diretório atual
  • -I ignorar arquivos binários
  • -H para gerar o nome do arquivo onde a correspondência é encontrada

Adequado apenas para pesquisa.

find + grep

$ find -type f -exec grep -IH 'word' {} \;
  • find a parte de pesquisa recursiva
  • -I opção é ignorar arquivos binários
  • -H para gerar o nome do arquivo onde a linha é encontrada
  • boa abordagem para combinar com outros comandos no subshell, como:

    $ 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 recursivo de pobre-homem no script bash recursivo

Este é o "caminho da festa". Não é o ideal, provavelmente não há um bom motivo para usar isso quando você tiver grepou estiver perlinstalado.

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

A pergunta é bastante antiga ... enfim ... atualmente (2016) existe um aplicativo gnome chamado tracker(você pode encontrá-lo nos repositórios do ubuntu) que pode ser instalado para procurar texto dentro dos arquivos (tente odt-ods-odp-pdf) . O pacote vem com outros 4 pacotes a serem instalados (tracker-extract, tracker-gui, tracker-miner-fs, tracker-utils) Namastè :)

cico
fonte
O Tracker é um bom software, mas exige que o índice já contenha informações sobre o arquivo que você deseja acessar com uma pesquisa. Ele usa menos recursos que Recoll, não tenho certeza sobre o tamanho do índice. Mas se você precisar pesquisar um arquivo com um texto específico e quiser fazê-lo com uma interface gráfica, a ferramenta de pesquisa do gnome resolverá o problema sem um índice. Era um aplicativo padrão nas versões anteriores do Ubuntu, não sei por que o removeram sem uma substituição.
Hatoru Hansou 27/09/16
2

Sim, eu sei que você estava procurando um aplicativo GUI e esse post é antigo, mas talvez isso ajude alguém. Encontrei o ack-grep util. Inicialmente, instale-o via sudo apt-get install ack-grepe, em seguida, execute o comando ack-grep what_you_looking_forno diretório em que deseja pesquisar. Isso mostra todos os arquivos nos quais está o seu texto e também mostra a visualização desses arquivos. E isso é tão importante para mim.

spajdo
fonte
0

Ainda mais simples e rápido é o "pesquisador prateado" sudo apt-get install silversearcher-ag. Dê uma olhada em https://github.com/ggreer/the_silver_searcher para reavaliar por que é melhor do que aceitar * entre outros.

Diego Andrés Díaz Espinoza
fonte