Как найти текстовый файл, который содержит определенное слово внутри (не от его имени)

86

Я хочу найти текстовый файл на моем жестком диске, содержащий определенное слово.

До Ubuntu 12.4 я использовал для запуска в тире приложение, я думаю, что он был вызван «Поиск файла ...», чей значок был увеличительным стеклом. Я больше не могу найти это простое приложение.     

задан SomeoneMe 29.04.2012 в 16:40
источник

6 ответов

142

Вы можете использовать команду grep из терминала:

 grep -r word *

Эта команда найдет все вхождения «слова» во всех файлах в текущем каталоге (или поддресах).

    
ответ дан Steve Chapel 29.04.2012 в 16:48
61

Установите gnome-search-tool.

sudo apt-get install gnome-search-tool

Открыть Search for files выбрать Select More Options и

ответ дан geoh 29.04.2012 в 16:48
4

Вопрос довольно старый ... в любом случае ... в настоящее время (2016) есть приложение gnome с именем tracker (вы можете найти его в репозиториях ubuntu), который можно установить для поиска текста внутри файлов (попробовал odt-ods-odp-pdf). Пакет поставляется с четырьмя другими пакетами, которые будут установлены (трекер-экстракт, трекер-gui, трекер-майнер-фс, трекер-утилиты) Namastè:)

    
ответ дан cico 14.01.2016 в 00:11
2

Да, я знаю, что вы искали приложение gui, и это старый пост, но, возможно, это поможет кому-то. Я нашел ack-grep util. Сначала установите его через sudo apt-get install ack-grep , а затем запустите команду ack-grep what_you_looking_for в каталоге, где вы хотите выполнить поиск. Это покажет вам все файлы, в которых находится ваш текст, а также покажет предварительный просмотр из этих файлов. И это так важно для меня.

    
ответ дан spajdo 25.02.2016 в 10:38
2

Вот обзор различных методов, которые можно использовать для поиска файлов для определенных строк текста, с несколькими опциями, добавленными специально для работы только с текстовыми файлами, и игнорировать файлы двоичных файлов / приложений.

Следует отметить, однако, что поиск слова может стать немного сложным, потому что большинство инструментов для сопоставления строк попытаются найти слово в любой точке строки. Если мы говорим о слове в виде строки, которая может появляться в начале или конце строки или в одиночестве на линии или окружена пробелами и / или пунктуацией - вот когда нам понадобятся регулярные выражения, и особенно те, которые приходят от Perl. Здесь, например, мы можем использовать -P в grep , чтобы использовать регулярные выражения Perl, чтобы окружить его.

$ 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

$ grep -rIH  'word'
  • -r для рекурсивного поиска из текущего каталога
  • -I для игнорирования двоичных файлов
  • -H для вывода имени файла, в котором найдено совпадение

Подходит только для поиска.

find + grep

$ find -type f -exec grep -IH 'word' {} \;
  • find выполняет рекурсивную поисковую часть
  • -I - игнорировать двоичные файлы.
  • -H для вывода имени файла, где найдена строка
  • хороший подход для объединения с другими командами внутри подоболочки, например:

    $ 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 в рекурсивном скрипте bash

Это «bash way». Не идеально, вероятно, нет веской причины использовать это, когда у вас установлено grep или 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 "$@"
    
ответ дан Sergiy Kolodyazhnyy 11.11.2017 в 18:00
0

Еще проще и быстрее «серебряный искатель» sudo apt-get install silversearcher-ag . Взгляните на Ссылка , чтобы узнать, почему он лучше, чем ack * среди других.

    
ответ дан Diego Andrés Díaz Espinoza 08.02.2017 в 16:52