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

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

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

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

  grep -r word * 

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

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

 sudo apt-get install gnome-search-tool 

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


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

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

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

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

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

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

Это «путь 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 "$@" 

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