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

93

Eu 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 traço um aplicativo, acho que era chamado de "Pesquisar por arquivo ...", cujo ícone era uma lupa. Não consigo mais encontrar esse aplicativo simples. / p>     

por SomeoneMe 29.04.2012 / 18:40

6 respostas

154

Você pode usar o comando grep 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).

    
por Steve Chapel 29.04.2012 / 18:48
63

Instale o gnome-search-tool.

sudo apt-get install gnome-search-tool

Abra Search for files select Select More Options e

por hingev 29.04.2012 / 18:48
4

A pergunta é bem antiga ... de qualquer forma ... 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 (tentado odt-ods-odp-pdf). O pacote vem com 4 outros pacotes a serem instalados (tracker-extract, tracker-gui, tracker-miner-fs, tracker-utils) Namastè:)

    
por cico 14.01.2016 / 01:11
2

Sim, eu sei que você estava procurando por um aplicativo gui e este é um post antigo, mas talvez isso ajude alguém. Eu encontrei ack-grep util. Primeiro, instale-o via sudo apt-get install ack-grep e, em seguida, execute o comando ack-grep what_you_looking_for no diretório em que você deseja pesquisar. Isso mostra todos os arquivos em que está o seu texto e também mostra a visualização desses arquivos. E isso é tão importante para mim.

    
por spajdo 25.02.2016 / 11:38
2

Aqui está uma visão geral dos diferentes métodos que podem ser usados para pesquisar arquivos em textos específicos, 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 ficar um pouco complexa, porque a maioria das ferramentas de correspondência de linha tentará encontrar uma palavra em qualquer lugar na linha. Se estamos falando de uma palavra como string que pode aparecer no começo ou no final da linha, ou sozinha na linha, ou cercada por espaços e / ou pontuação - é quando precisaremos de expressões regulares, especialmente aquelas que vêm de Perl. Aqui, por exemplo, podemos usar -P em grep para fazer 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

Simple grep

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

Adequado apenas para pesquisa.

encontrar + grep

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

    $ 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 recursivo de pobres-homens no script bash recursivo

Este é o "caminho bash". Não é o ideal, provavelmente não é um bom motivo para usar isso quando você tem grep ou perl instalado.

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

Ainda mais simples e rápido é o "silver searcher" sudo apt-get install silversearcher-ag . Dê uma olhada no link para reassumir por que ele é melhor que ack * entre outros.

    
por Diego Andrés Díaz Espinoza 08.02.2017 / 17:52