Поиск файлов по содержимому из терминала

    Думаю, многие не раз сталкивались с такой проблемой, как необходимость найти в папке с файлами (а порой и подпапками, в которых тоже неплохо бы поискать) файл, зная кусочек его текста (ну, или догадываясь о нем). Я тоже много раз спотыкался об эту необходимость и вот, наконец, собрался и написал небольшой скрипт на bash, выполняющий эту задачу.

    image



    Скрипт вызывается строкой
    textfind %name%
    Также можно задать шаблон имени файла (вторым аргументом) и цвет, которым будут выводится имена файлов, в которых найден искомый отрывок (зеленый по умолчанию, для включения цвета нужно установить утилиту set_color, под убунтой — sudo apt-get install fish).

    Вот, собственно сам скрипт:

    #!/bin/bash
    cmd="find -type f -print "
    set_color_cmd="set_color"
    if [ $2 ]; then cmd="$cmd -name \"$2\""; fi
    color="green"
    if [ $3 ]; then color=$3; fi

    is_colored=1
    hh=$(which "$set_color_cmd")
    if [ $? -ne 0 ]; then is_colored=''; fi

    $cmd | while read f; do
    cnt=$(grep -c "$1" "$f")
    if [ $cnt -gt 0 ]; then
    if [ $is_colored ]; then "$set_color_cmd" "$color"; fi
    echo "$f"
    if [ $is_colored ]; then "$set_color_cmd" normal; fi
    grep -n "$1" "$f"
    fi
    done



    Скачать можно по ссылке: Скрипт
    Поделиться публикацией
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 40
      +52
      Мне вполне хватает: grep -r «TEXT» /files
        –22
        упс… не знал про эту команду:)
          +8
          Такие простейшие вещи, и все большинство, что можно было бы придумать уже за вас реализовано.
          Не проще было сделать так? google.ru {linux поиск в файлах}, а потом уже велосипет.
          Хотя чего грешить и сам было писал велосипеды :)
            +2
              0
              Хренасе не знать! Читай Брайна Кернигана «UNIX программное окружение». Отцы дерьма не напишут!
              0
              А еще лучше grep -r -n «text» /path
              -n показывает строку где был найден фрагмент
                +2
                ну и -C 3 — чтобы видеть +- 3 строки вокруг
                  +1
                  А еще -A и -B…
                  А пуще того, man grep (egrep,fgrep)…
                  А сколько нам открытий чудных готовит пайпер…
                  А sed|awk…
                  У меня даже слов нет…
                  И подкаждую комбинацию готовить скрипт…
                  Не… Командная строка рулит…
                  ;)
                  Хотя, интерес народа к возможностям командной строки радует…
                    0
                    Что плохо в man grep (а тем более info grep), что возможностей и ключей у неё до фига и держать их все в голове, имхо, не реально. Даже возможности, чтоб ключ подсмотреть в полной уверенности, что он есть.

                    Учить их впрок — как-то глупо, разбираться каждый раз почти с нуля — неэффективно. Проще написать свой скрипт, который решает твои задачи, а не «неопределенного круга лиц». Пускай этот скрипт даже будет вызовом того же grep c теми ключами, с которыми разобрался (или где-то подсмотрел), но которые явно не запомнишь. Дать ему понятное для себя имя и юзать. Недостаток такого подхода — на чужой машине будешь беспомощен. Зато на своей — царь и бог без необходимости зубрить весь /usr/bin и ключи каждой программы в нём :)
                    • НЛО прилетело и опубликовало эту надпись здесь
                        0
                        unimplemented features. :)
                        0
                        > Учить их впрок — как-то глупо, разбираться каждый раз почти с нуля — неэффективно.
                        По мере использования, ключи запоминаются, и уже не «с нуля».
                        По мере осознания — нарабатываются навыки наиболее эффективного применения.
                        Готов спорить, всех ключей не помнят даже самые крутые «гуру»… Разве что авторы…
                        Не писать же обертку для каждой комбинации ключей и цепочки вызовов с пайперами.
                        Иначе, со временем у вас наберется такое количество оберток, что вы забудете, какая и для чего.

                        Я, конечно, понимаю программистов, открывших для себя возможность программировать на языке оболочки, но уверен, что и они, со временем, освоят несколько десятков «трюков» без всяких скриптовых оберток.

                        А возможность вызвать удачную команду из истории, подправить ее по ситуации и применить, существенно облегчит жизнь.

                        И ваши волосы станут мяшкими и шелковистыми…
                        ;)
                          0
                          Не надо ничего учить.
                          Жмете ctrl+R и ищете в истории командной строки.
                  0
                  Ещё очень полезной штукой является второй регэксп, фильтрующий имена файлов (расширения, например). Так же неплохо бы использовать egrep, у него, вроде, плюшек побольше.
                    +3
                    Ну, целью было написать самый простой скрипт. И судя по комментарию выше, эти полчаса потрачены были зря.
                      0
                      Ну допиливайте плюшки к скрипту и тогда он станет действительно полезным. Собственно, уже сейчас вывод покрасивше, чем у grep -r.
                        0
                        Пожалуй так и поступлю:)
                          +7
                          зачем?

                          grep -nTH --color=auto

                          и попытайтесь объяснить, что же революционно нового в этом велосипеде (автор, без обид… )?

                          Автору:
                          лучше потратьте время и силы для чего-нибудь действительно полезного, в крайнем случае помогите улучшить grep если есть желание и умные идеи.
                            –5
                            Оу. Может, ещё подскажете, как его заставить адекватно фильтровать имена файлов?
                              +3
                              я вас не понимаю )))
                              что значит адекватно фильтровать, не всё подряд проверять?
                              find dir/ -name '*.txt' | xargs grep…
                              ну или при помощи exec… просто я обычно в файл всё грепплю подобной конструкцией
                                –3
                                find dir/ -name '*.txt' | xargs grep
                                Ну это уже целых три разных бинарника. Просто хочется писать меньше букв и чтобы всё сразу было. У себя для этих целей держу кучу alias-ов.
                                  +3
                                  > Просто хочется писать меньше букв и чтобы всё сразу было
                                  Не, это не тру unix-way :)
                                  Одна задача — одно приложение.
                                    +1
                                    unix-way — это очень хорошо, но для часто выполняемых действий нужна и кнопка «сделать заебись».
                                      0
                                      vim /home/{username}/.bashrc
                                      alias
                                      0
                                      Шелл-скрипты обязательно считать приложением? А скрипты на других интерпретируемых языках (python, ruby, php например)? А на компилируемых? А если задача сложная и одним глаголом (или его производными) не описывается?
                          0
                          Сорри за оффтоп, немного не так прочитал ваш коммент первый раз))
                          +2
                          Пакет ack-grep (в маке просто ack) — работает быстрее grep -r и находит все прекрасно.
                            0
                            Действительно хорошая утилита, жаль раньше не знал про неё)
                            –14
                            Yii — респект ;)
                              –12
                              Недавно начал изучать, тоже в экстазе:)
                              +2
                              Новые велосипеды — такие новые :)

                              man grep (grep -rl 'pattern' /path/to/files)
                                +1
                                Всегда пользуюсь grep «text» * -ir
                                  +3
                                  А это мой:

                                  find ./ -type f -exec grep -H 'my_string' '{}' \;
                                  –3
                                  Ебать!
                                    –1
                                    А в чём смысл полупрозрачного терминала?
                                    • НЛО прилетело и опубликовало эту надпись здесь
                                        +2
                                        И у меня, и у меня! :)
                                        Удобно, если на фоне открыта какая-нибудь статья/howto/man.
                                          +1
                                          В данном случае видно имена файлов/каталогов, которые можно вводить в качестве пути поиска, а не мучаться с автокомплитом.
                                          0
                                          yii!

                                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                          Самое читаемое