Comment trouver un fichier texte contenant un mot spécifique à l'intérieur (pas dans son nom)

97

Je souhaite trouver un fichier texte sur mon disque dur contenant un mot spécifique.

Avant Ubuntu 12.4, j’avais l'habitude de lancer dans le tableau de bord une application, je crois qu'elle s'appelait "Rechercher un fichier ...", dont l'icône était une loupe. Je ne trouve plus cette application simple.

    
posée SomeoneMe 29.04.2012 - 18:40
la source

6 réponses

159

Vous pouvez utiliser la commande grep à partir du terminal:

 grep -r word *

Cette commande trouvera toutes les occurrences de "mot" dans tous les fichiers du répertoire actuel (ou des sous-répertoires).

    
réponse donnée Steve Chapel 29.04.2012 - 18:48
la source
63

Installez gnome-search-tool.

sudo apt-get install gnome-search-tool

Ouvrez Search for files select Select More Options et

réponse donnée hingev 29.04.2012 - 18:48
la source
4

La question est assez ancienne ... de toute façon ... Actuellement (2016), il existe une application gnome appelée tracker (que vous pouvez trouver dans les dépôts Ubuntu) qui peut être installée pour rechercher du texte dans les fichiers (essayé odt-ods-odp-pdf). Le paquet est livré avec 4 autres paquets à installer (tracker-extract, tracker-gui, tracker-miner-fs, tracker-utils) Namastè:)

    
réponse donnée cico 14.01.2016 - 01:11
la source
2

Oui, je sais que vous cherchiez une application gui et que c'est un ancien message, mais peut-être que cela aide quelqu'un. J'ai trouvé ack-grep util. Installez-le d'abord via sudo apt-get install ack-grep , puis exécutez la commande ack-grep what_you_looking_for dans le répertoire où vous souhaitez effectuer la recherche. Cela vous montre tous les fichiers dans lesquels se trouve votre texte et montre également un aperçu de ces fichiers. Et c'est si important pour moi.

    
réponse donnée spajdo 25.02.2016 - 11:38
la source
2

Voici un aperçu des différentes méthodes que l’on peut utiliser pour rechercher des fichiers de chaînes de texte spécifiques, avec quelques options ajoutées spécifiquement pour travailler uniquement avec des fichiers texte et ignorer les fichiers binaires / d’application.

Il convient toutefois de noter que la recherche de mot peut être un peu complexe, car la plupart des outils de correspondance de lignes essaient de trouver un mot n'importe où sur la ligne. Si nous parlons d'un mot comme une chaîne qui pourrait apparaître au début ou à la fin de la ligne, ou seul sur la ligne, ou entouré d'espaces et / ou de ponctuation - cela nécessiterait des expressions régulières, en particulier celles qui viennent de Perl. Ici, par exemple, nous pouvons utiliser -P in grep pour utiliser les expressions régulières Perl pour l'entourer.

$ 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 pour la recherche récursive à partir du répertoire courant
  • -I pour ignorer les fichiers binaires
  • -H à la sortie du nom de fichier où la correspondance est trouvée

Convient uniquement à la recherche.

find + grep

$ find -type f -exec grep -IH 'word' {} \;
  • find effectue la recherche récursive
  • L'option -I consiste à ignorer les fichiers binaires
  • -H à la sortie du nom du fichier où la ligne est trouvée
  • bonne approche pour combiner avec d'autres commandes dans subshell, comme:

    $ 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 récursif pauvre-mans en script bash récursif

Ceci est la "manière bash". Pas idéal, probablement aucune raison de l'utiliser lorsque vous avez installé grep ou perl .

#!/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 "$@"
    
réponse donnée Sergiy Kolodyazhnyy 11.11.2017 - 19:00
la source
0

Encore plus simple et plus rapide, le "chercheur d’argent" sudo apt-get install silversearcher-ag . Jetez un coup d’œil à lien pour trouver des raisons pour lesquelles il vaut mieux que ack * entre autres.

    
réponse donnée Diego Andrés Díaz Espinoza 08.02.2017 - 17:52
la source

Lire d'autres questions sur les étiquettes