it-swarm.dev

Jak najít textový soubor, který obsahuje konkrétní slovo uvnitř (nikoli v názvu)

Chci najít textový soubor na pevném disku, který obsahuje konkrétní slovo.

Před Ubuntu 12.4 jsem v pomlčce začínal s aplikací, myslím, že se jí říkalo „Vyhledat soubor ...“, jejíž ikona byla zvětšovací sklo. Tuto jednoduchou aplikaci už nemůžu najít.

130
SomeoneMe

Příkaz grep můžete použít z terminálu:

 grep -r Word *

Tento příkaz vyhledá všechny výskyty slova „Word“ ve všech souborech v aktuálním adresáři (nebo podadresářích).

210
Steve Chapel

Nainstalujte nástroj gnome-search-tool.

Sudo apt-get install gnome-search-tool

Otevřeno Search for files vyberte Select More Options a


enter image description here
67
hingev

Zde je přehled různých metod, které lze použít k prohledá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í binárních/aplikačních souborů.

Je však třeba si uvědomit, že vyhledávání slova Word může být trochu složitější, protože většina nástrojů pro porovnávání řádků se pokusí najít slovo kdekoli na řádku. Pokud mluvíme o Slovu jako o řetězci, který se může objevit na začátku nebo na konci řádku, nebo samostatně na řádku, nebo je obklopen mezerami a interpunkcemi - tehdy potřebujeme regulární výrazy, a zejména ty, které přicházejí od Perl. Zde můžeme například použít -P in grep pro použití regulárních výrazů Perl, které jej 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í dolů z aktuálního adresáře
  • -I ignorovat binární soubory
  • -H pro výstup názvu souboru, kde je nalezena shoda

Vhodné pouze pro vyhledávání.

najít + grep

$ find -type f -exec grep -IH 'Word' {} \;
  • find provádí rekurzivní vyhledávací část
  • -I možnost je ignorovat binární soubory
  • -H pro výstup názvu souboru, kde je řádek nalezen
  • dobrý přístup pro kombinování s dalšími příkazy v rámci podshell, jako například:

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

rekurzivní grep chudých lidí v rekurzivním bash skriptu

Toto je „bash cesta“. Není ideální, pravděpodobně žádný dobrý důvod k použití, pokud máte nainstalován grep nebo 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 "$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 "[email protected]"
10

Otázka je docela stará ... stejně ... v současné době (2016) existuje aplikace gnome s názvem tracker (najdete ji v úložištích Ubuntu), kterou lze nainstalovat pro vyhledávání textu uvnitř souborů (vyzkoušeno odt- ods-odp-pdf). Balíček je dodáván se 4 dalšími balíčky, které mají být nainstalovány (tracker-extract, tracker-gui, tracker-miner-fs, tracker-utils) Namastè :)

5
cico

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

2
spajdo

Ještě jednodušší a rychlejší je „stříbrný vyhledávač“ Sudo apt-get install silversearcher-ag. Podívejte se na https://github.com/ggreer/the_silver_searcher , kde najdete odpovědi na to, proč je mezi ostatními lepší.

Zástupné znaky můžete zadat v případě, že chcete hledat v konkrétních souborech.

Například: Pokud chcete najít, jaké jsou všechny soubory * .conf, které v nich mají slovo SSLCertificateFile, můžete to spustit v kořenovém adresáři:

Sudo grep -rIH  'SSLCertificateFile' --include \*.conf
0
Atul