Vraag Een tekstbestand vinden dat een specifiek woord bevat (niet in de naam)


Ik wil een tekstbestand op mijn harde schijf vinden dat een specifiek woord bevat.

Voorafgaand aan Ubuntu 12.4 begon ik in het dashboard met een applicatie, ik denk dat het "Zoek naar bestand ..." heette, waarvan het pictogram een ​​vergrootglas was. Ik kan die eenvoudige applicatie niet meer vinden.


97
2018-04-29 16:40


oorsprong




antwoorden:


U kunt de grep commando van terminal:

 grep -r word *

Deze opdracht zal alle voorkomens van "woord" vinden in alle bestanden onder de huidige map (of subdelectoren).


161
2018-04-29 16:48



Hij noemde specifiek een gui-methode;) - Rinzwind
Het sterretje komt niet overeen met verborgen bestanden. Om te zoeken naar alle bestanden die u kunt uitvoeren grep -r word .. - Ian Mackinnon
@Rinzwind: niet in de titel! Ik kwam hier om te googlen naar de consolemanier om woorden in bestanden te zoeken, dus dit antwoord is perfect voor mij! - Nikolay Ivanov
De terminal heeft een gui ... het is gewoon een gui dat je dingen intypt in :-D - billynoah
het is misschien niet het geaccepteerde antwoord vanwege de gui, maar het is inderdaad het juiste antwoord :) - inquisitive


Installeer gnome-zoek-tool.

sudo apt-get install gnome-search-tool

Open Search for files kiezen Select More Options en


enter image description here


63
2018-04-29 16:48



moet je het OS opnieuw opstarten om dit te laten werken? of misschien werkt het niet in 12? - jcollum
heb je een deel geïnstalleerd? Ik ben er vrij zeker van dat het moet werken, het werkt op 13.04. - hingev
which gnome-search-tool = /usr/bin/gnome-search-tool... maar wanneer ik de zoekoptie in gnome open (Go, Zoeken naar bestanden ...), is er geen optie voor "Meer opties selecteren" - jcollum
open door in terminal te typen: gnome-search-tool en ik weet zeker dat je het zult zien. - hingev
Je kunt gnome-search-tool starten via het streepje "Zoeken naar bestanden", dus je hebt de terminal niet nodig. - Bernard Decock


Vraag is vrij oud ... hoe dan ook ... momenteel (2016) is er een gnome-app genaamd tracker (je kunt het vinden in ubuntu-repositories) die kunnen worden geïnstalleerd om binnen tekstbestanden naar tekst te zoeken (odt-ods-odp-pdf geprobeerd). Het pakket wordt geleverd met 4 andere pakketten die moeten worden geïnstalleerd (tracker-extract, tracker-gui, tracker-miner-fs, tracker-utils) Namastè :)


4
2018-01-14 00:11



Tracker is goede software, maar het vereist dat de index al informatie bevat over het bestand dat u interesseert om het te raken met een zoekopdracht. Het gebruikt minder middelen dan Recoll, ik ben niet zeker van de indexgrootte. Maar als u een bestand met een specifieke tekst wilt doorzoeken en het wilt doen met een gui, lost de gnome-search-tool het probleem op zonder een index. Het was een standaardapp in vorige Ubuntu-versies, ik weet niet waarom ze het zonder een vervanging hebben verwijderd. - Hatoru Hansou


Ja, ik weet dat je op zoek was naar een gui-applicatie en dit is een oude post, maar misschien helpt dit iemand. Ik heb ack-grep util gevonden. Installeer het eerst via sudo apt-get install ack-grep en voer dan het commando uit ack-grep what_you_looking_for in de map waar u wilt zoeken. Dit toont u alle bestanden waarin uw tekst staat en toont ook een voorbeeld van deze bestanden. En dit is zo belangrijk voor mij.


2
2018-02-25 10:38





Hier volgt een overzicht van verschillende methoden die u kunt gebruiken om bestanden te zoeken op specifieke tekenreeksen, met een paar opties die specifiek zijn toegevoegd om alleen met tekstbestanden te werken en binaire / toepassingsbestanden te negeren.

Er moet echter worden opgemerkt dat zoeken naar woorden een beetje ingewikkeld kan worden, omdat de meeste tools voor lijnafstemming een woord overal op de lijn proberen te vinden. Als we het hebben over een woord als een tekenreeks die aan het begin of het einde van een regel kan voorkomen, of alleen aan de lijn of omringd door spaties en / of interpunctie, dan hebben we reguliere expressies nodig, en vooral die die komen van Perl. Hier kunnen we bijvoorbeeld gebruiken -P in grep om gebruik te maken van Perl reguliere expressies om het te omringen.

$ 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

Eenvoudige grep

$ grep -rIH  'word'
  • -r voor recursieve zoekopdracht uit de huidige map
  • -I om binaire bestanden te negeren
  • -H om de bestandsnaam uit te voeren waar de overeenkomst is gevonden

Alleen geschikt voor zoeken.

vind + grep

$ find -type f -exec grep -IH 'word' {} \;
  • find doet het recursieve zoekgedeelte
  • -I optie is om binaire bestanden te negeren
  • -H om de bestandsnaam uit te voeren waar de regel is gevonden
  • goede aanpak voor het combineren met andere opdrachten in subshell, zoals:

    $ 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 },".")

arm-mans recursieve grep in recursief bash-script

Dit is de "bash-manier". Niet ideaal, waarschijnlijk geen goede reden om dit te gebruiken als je dat hebt gedaan grep of perl geïnstalleerd.

#!/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 "$@"

2
2017-11-11 18:00





Nog eenvoudiger en sneller is 'zilverzoeker' sudo apt-get install silversearcher-ag. Kijk eens naar https://github.com/ggreer/the_silver_searcher voor heroverwegen waarom het beter is dan ack * onder anderen.


0
2018-02-08 16:52