Jak najít textový soubor, který obsahuje určité slovo uvnitř (ne ve jménu)

97

Chci najít na svém pevném disku textový soubor obsahující konkrétní slovo.

Před Ubuntu 12.4 jsem začal v pomlčce aplikace, myslím, že to bylo nazýváno "Vyhledat soubor ...", jehož ikona byla zvětšovací sklo.Nemohu najít tuto jednoduchou aplikaci už. / p>     

dané SomeoneMe 29.04.2012 18:40

6 odpovědí

162

Můžete použít příkazgrep z terminálu:

 grep -r word *

Tento příkaz najde všechny výskyty slova "word" ve všech souborech pod aktuálním adresářem (nebo subdrectories).

    
odpověděl Steve Chapel 29.04.2012 18:48
63

Nainstalujte nástroj gnome-search-tool.

sudo apt-get install gnome-search-tool

OtevřeteSearch for files selectSelect More Options a

odpověděl hingev 29.04.2012 18:48
4

Otázka je docela stará ... v současné době (2016) existuje aplikace GNOME s názvemtracker (můžete ji najít v úložištích ubuntu), které lze nainstalovat pro vyhledání textu uvnitř souborů (zkus odt-ods-odp-pdf). Balík je dodáván s dalšími 4 dalšími balíčky, které mají být nainstalovány (tracker-extract, tracker-gui, tracker-miner-fs, tracker-utils) Namasté:)

    
odpověděl cico 14.01.2016 01:11
2

Ano, vím, že hledáte aplikaci gui a to je starý příspěvek, ale možná to někomu pomůže. Našel jsem ack-grep util. Nejdříve jej nainstalujte pomocísudo apt-get install ack-grep a poté spusťte příkazack-grep what_you_looking_for v adresáři, kde chcete vyhledat. Zobrazují se všechny soubory, ve kterých je váš text, a také ukázka náhledu z těchto souborů. A to je pro mě tak důležité.

    
odpověděl spajdo 25.02.2016 11:38
2

Zde je přehled různých metod, které lze použít pro vyhledávání souborů pro konkrétní řetězce textu, s několika možnostmi přidanými speciálně pro práci pouze s textovými soubory a ignorování souborů binárních souborů / aplikací.

Měli bychom však poznamenat, že vyhledávání slov může být trochu složité, protože většina nástrojů pro porovnávání linek se pokusí najít slovo kdekoli na řádku. Pokud mluvíme o nějakém slovu jako řetězec, který by se mohl objevit na začátku nebo na konci řádku, nebo sám na řádku, nebo obklopený mezerami a / nebo interpunkcemi - to bude, když budeme potřebovat regulární výrazy a obzvláště ti, od Perl. Zde například můžeme použít-P vgrep pro využití regulárních výrazů Perl, které obklopují.

$ 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

Jednoduchý grep

$ grep -rIH  'word'
  • -r pro rekurzivní vyhledávání z aktuálního adresáře
  • -I ignorovat binární soubory
  • -H k výstupnímu názvu souboru, kde je shoda nalezena

Vhodné pouze pro vyhledávání.

najít + grep

$ find -type f -exec grep -IH 'word' {} \;
  • find provádí rekurzivní vyhledávací část
  • Možnost-I je ignorovat binární soubory
  • -H k výstupnímu názvu souboru, kde je nalezena linka
  • dobrý přístup pro kombinaci s dalšími příkazy v rámci subshell, jako například:

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

rekurzivní grep s chudobou v rekurzivním bash skriptu

Toto je "bash cesta". Není to ideální, pravděpodobně žádný dobrý důvod k použití, pokud mátegrep neboperl nainstalován.

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

Ještě jednodušší a rychlejší je "stříbrný vyhledávač"sudo apt-get install silversearcher-ag. Podívejte se na Odkaz , kde se dozvíte, proč je lepší než ack * mezi ostatními.

    
odpověděl Diego Andrés Díaz Espinoza 08.02.2017 17:52