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

97

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

Antes de Ubuntu 12.4 solía comenzar 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.

    
pregunta SomeoneMe 29.04.2012 - 18:40

6 respuestas

159

Puede usar el comando grep desde la terminal:

 grep -r word *

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

    
respondido por el Steve Chapel 29.04.2012 - 18:48
63

Instalar gnome-search-tool.

sudo apt-get install gnome-search-tool

Abrir Search for files seleccionar Select More Options y

respondido por el hingev 29.04.2012 - 18:48
4

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

    
respondido por el cico 14.01.2016 - 01:11
2

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

    
respondido por el spajdo 25.02.2016 - 11:38
2

A continuación, presentamos una descripción general de los diferentes métodos que se pueden usar para buscar archivos de cadenas de texto específicas, con algunas opciones añadidas específicamente para trabajar solo con archivos de texto e ignorar archivos binarios / de aplicaciones.

Sin embargo, se debe tener en cuenta que la búsqueda de palabras puede ser un poco compleja, porque la mayoría de las herramientas de coincidencia de líneas intentarán encontrar una palabra en cualquier lugar de la línea. Si hablamos de una palabra como cadena que podría aparecer al principio o al final de la línea, o solo en la línea, o rodeado de espacios y / o signos de puntuación, es entonces cuando necesitaremos expresiones regulares, y especialmente aquellas que vienen de Perl. Aquí, por ejemplo, podemos usar -P en grep para hacer uso de las 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 para ignorar los archivos binarios
  • -H al nombre del archivo de salida donde se encuentra la coincidencia

Solo para búsquedas.

buscar + grep

$ find -type f -exec grep -IH 'word' {} \;
  • find hace la parte de búsqueda recursiva
  • La opción -I consiste en ignorar los archivos binarios
  • -H para el nombre de archivo de salida 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" "" && 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 personas pobres en script bash recursivo

Este es el "camino de bash". No es ideal, probablemente no sea una buena razón para usar esto cuando tienes grep o 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 "$@"
    
respondido por el Sergiy Kolodyazhnyy 11.11.2017 - 19:00
0

Aún más simple y más rápido es "buscador de plata" sudo apt-get install silversearcher-ag . Eche un vistazo a enlace para obtener más información sobre por qué es mejor que ack *, entre otros.

    
respondido por el Diego Andrés Díaz Espinoza 08.02.2017 - 17:52

Lea otras preguntas en las etiquetas