Cómo encontrar un archivo de texto que contenga una palabra específica dentro (no en su nombre)

117

Quiero encontrar un archivo de texto en mi disco duro que contenga una palabra específica.

Antes de Ubuntu 12.4, solía iniciar en el tablero una aplicación, creo que se llamaba "Buscar archivo ...", cuyo icono era una lupa. Ya no puedo encontrar esa aplicación simple.

Alguien me
fuente

Respuestas:

198

Puedes usar el grepcomando desde la terminal:

 grep -r word *

Este comando encontrará todas las apariciones de "word" en todos los archivos en el directorio actual (o subdirectorios).

Steve Chapel
fuente
99
El asterisco no coincide con los archivos ocultos. Para buscar todos los archivos que puede ejecutar grep -r word ..
Ian Mackinnon
si se llama a grep desde un script de shell, entonces la palabra clave de búsqueda puede no imprimirse resaltada, pero la --color=autobandera puede resolver eso.
noobninja
67

Instala gnome-search-tool.

sudo apt-get install gnome-search-tool

Abrir Search for filesseleccionar Select More Optionsy


ingrese la descripción de la imagen aquí

bisagra
fuente
1
¿Tienes que reiniciar el sistema operativo para que esto funcione? o tal vez no funciona en 12?
jcollum
¿has hecho parte de instalación? Estoy bastante seguro de que debe funcionar, funciona en 13.04.
hingev
which gnome-search-tool= /usr/bin/gnome-search-tool... pero cuando abro la opción de búsqueda en gnome (Ir, Buscar archivos ...) no hay opción para "Seleccionar más opciones"
jcollum
1
abre escribiendo terminal: gnome-search-tooly estoy seguro de que lo verás.
hingev
Puede iniciar gnome-search-tool a través del guión "Buscar archivos", por lo que no necesita el terminal.
Bernard Decock
6

Aquí hay una descripción general de los diferentes métodos que uno puede usar para buscar archivos de cadenas de texto específicas, con algunas opciones agregadas específicamente para trabajar solo con archivos de texto e ignorar los archivos binarios / de aplicación.

Sin embargo, se debe tener en cuenta que la búsqueda de palabras puede volverse un poco compleja, porque la mayoría de las herramientas de coincidencia de líneas tratarán de encontrar una palabra en cualquier lugar de la línea. Si estamos hablando de una palabra como cadena que podría aparecer al principio o al final de la línea, o sola en la línea, o rodeada de espacios y / o puntuación, es cuando necesitaremos expresiones regulares, y especialmente las que vienen de Perl. Aquí, por ejemplo, podemos utilizar -Pen grephacer uso de expresiones regulares de Perl para rodearlo.

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

$ grep -rIH  'word'
  • -r para búsqueda recursiva desde el directorio actual
  • -I ignorar archivos binarios
  • -H dar salida al nombre del archivo donde se encuentra la coincidencia

Apto solo para búsquedas.

encontrar + grep

$ find -type f -exec grep -IH 'word' {} \;
  • find hace la parte de búsqueda recursiva
  • -I la opción es ignorar archivos binarios
  • -H dar salida al nombre del archivo donde se encuentra la línea
  • buen enfoque para combinar con otros comandos dentro de 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 los pobres en script bash recursivo

Esta es la "manera bash". No es ideal, probablemente no hay una buena razón para usar esto cuando lo tiene grepo lo perlinstala.

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

La pregunta es bastante antigua ... de todos modos ... actualmente (2016) hay una aplicación gnome llamada tracker(puede encontrarla en los repositorios de ubuntu) que se puede instalar para buscar texto dentro de los archivos (intentado odt-ods-odp-pdf) . El paquete viene con otros 4 paquetes para instalar (tracker-extract, tracker-gui, tracker-miner-fs, tracker-utils) Namastè :)

cico
fuente
Tracker es un buen software, pero requiere que el índice ya contenga información sobre el archivo que le interesa para golpearlo con una búsqueda. Utiliza menos recursos que Recoll, no estoy seguro del tamaño del índice. Pero si necesita buscar un archivo con un texto específico y desea hacerlo con una interfaz gráfica de usuario, gnome-search-tool resuelve el problema sin un índice. Era una aplicación predeterminada en versiones anteriores de Ubuntu, no sé por qué la eliminaron sin un reemplazo.
Hatoru Hansou
2

Sí, sé que estaba buscando una aplicación de interfaz gráfica de usuario y esta es una publicación antigua, pero tal vez esto ayude a alguien. Encontré ack-grep util. Primero, instálelo a través de sudo apt-get install ack-grepy luego ejecute el comando ack-grep what_you_looking_foren el directorio donde desea buscar. Esto le muestra todos los archivos en los que se encuentra su texto y también muestra la vista previa de estos archivos. Y esto es muy importante para mí.

Spajdo
fuente