Як знайти текстовий файл, який містить певне слово всередині (а не його назва)


116

Я хочу знайти на своєму жорсткому диску текстовий файл, який містить певне слово.

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

Відповіді:


197

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

 grep -r word *

Ця команда знайде всі зустрічі "word" у всіх файлах у поточному каталозі (або в підкаталогах).


9
Зірочка не відповідає прихованим файлам. Для пошуку всіх файлів, які можна запустити grep -r word ..
Іван Макіннон

якщо grep викликається зі скрипту оболонки, то ключове слово пошуку може не друкуватись виділеним, але --color=autoпрапор може це вирішити.
noobninja

67

Встановіть інструмент пошуку gnome-search.

sudo apt-get install gnome-search-tool

Відкрийте Search for filesвибір Select More Optionsі


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


1
чи потрібно перезапустити ОС, щоб це працювало? а може, це не працює в 12?
jcollum

Ви зробили встановити частину? Я впевнений, що це має працювати, працює 13.04.
hingev

which gnome-search-tool= /usr/bin/gnome-search-tool... але коли я відкриваю опцію пошуку в gnome (Перейти, шукати файли ...), немає опції для "Вибрати додаткові параметри"
jcollum

1
відкрити, набравши термінал: gnome-search-toolі я впевнений, що ви це побачите.
hingev

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

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 -rIH  'word'
  • -r для рекурсивного пошуку вниз з поточного каталогу
  • -I ігнорувати бінарні файли
  • -H вивести ім'я файлу, де знайдено збіг

Підходить лише для пошуку.

знайти + греп

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

рекурсивний греп з бідними манами в рекурсивному скрипті 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-extra, tracker-gui, tracker-miner-fs, tracker-utils) Namastè :)


Tracker - це хороше програмне забезпечення, але він вимагає, щоб індекс вже містив інформацію про файл, який ви цікавите, щоб потрапити на нього при пошуку. Він використовує менше ресурсів, ніж Recoll, я не впевнений у розмірі індексу. Але якщо вам потрібно шукати файл із певним текстом і хочете це зробити за допомогою gui, gnome-search-tool вирішує проблему без індексу. Це був додаток за замовчуванням у попередніх версіях Ubuntu, я не знаю, чому його видалили без заміни.
Хатору Хансу

2

Так, я знаю, ви шукали заявку на gui, і це стара публікація, але, можливо, це комусь допоможе. Я знайшов ack-grep util. Спочатку встановіть його через, sudo apt-get install ack-grepа потім запустіть команду ack-grep what_you_looking_forв каталозі, де потрібно шукати. Це показує всі файли, в яких є ваш текст, а також показує попередній перегляд цих файлів. І це для мене так важливо.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.