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


117

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

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

Ответы:


198

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

 grep -r word *

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


9
Звездочка не соответствует скрытым файлам. Для поиска всех файлов вы можете запустить grep -r word ..
Ян Маккиннон

если grep вызывается из сценария оболочки, то ключевое слово поиска может не печататься подсвеченным, но --color=autoфлаг может решить это.
Нообниня

67

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

sudo apt-get install gnome-search-tool

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


введите описание изображения здесь


1
Вам нужно перезагрузить ОС, чтобы заставить это работать? или, может быть, это не работает в 12?
Jcollum

Вы сделали установку части? Я уверен, что он должен работать, он работает 13.04.
Хингев

which gnome-search-tool= /usr/bin/gnome-search-tool... но когда я открываю опцию поиска в gnome (Go, Поиск файлов ...), нет опции "Выбрать дополнительные параметры"
jcollum

1
открыть, введя в терминал: gnome-search-toolи я уверен, что вы увидите это.
Хингев,

Вы можете запустить gnome-search-tool через дефис "Поиск файлов", поэтому вам не нужен терминал.
Бернард Декок

6

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

Следует отметить, однако, что поиск слова может быть немного сложным, потому что большинство инструментов соответствия строк будут пытаться найти слово в любом месте строки. Если мы говорим о слове как о строке, которая может появиться в начале или конце строки, или одна в строке, или окруженная пробелами и / или пунктуацией - тогда нам понадобятся регулярные выражения, особенно те, которые идут из 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 вывести имя файла, где найдено совпадение

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

найти + grep

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

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

рекурсивный grep бедняков в рекурсивном скрипте bash

Это и есть "путь". Не идеально, вероятно, нет веских причин использовать это, когда у вас есть 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 "$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 "$@"

4

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


Tracker - хорошее программное обеспечение, но он требует, чтобы индекс уже содержал информацию о интересующем вас файле, чтобы найти его с помощью поиска. Он использует меньше ресурсов, чем Recoll, я не уверен насчет размера индекса. Но если вам нужен поиск файла с определенным текстом и вы хотите сделать это с помощью графического интерфейса, gnome-search-tool решит проблему без индекса. Это было приложение по умолчанию в предыдущих версиях Ubuntu, я не знаю, почему они удалили его без замены.
Hatoru Hansou

2

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.