Необходимо в каталоге найти файлы содержащие определенную фразу. Как это сделать? Думаю, многие не раз сталкивались с подобной проблемой, как необходимость найти в папке с файлами (а порой и подпапками, в которых тоже хорошо бы поискать) файл, зная кусочек его текста (ну, или догадываясь о нем). Я тоже много раз спотыкался об эту нужда и вот, наконец, собрался и написал небольшой скрипт на bash, выполняющий эту задачу. Не самой общераспространенной задачей, но всё же имеющей место быть, является поиск исполняемого файла программы. Она воспринимает в качестве параметра имя программы, а после выполнения выводит в терминал список с расположением одновременных файлов. Иногда может понадобится найти файл, в котором содержится определённая строчка или найти строку в файле, где есть нужное слово. В Linux всё это делается с помощью одной весьма простой, но в то же время мощной утилиты grep. С её помощью можно искать не только строчки в файлах, но и фильтровать вывод команд, и много чего ещё.
Содержание статьи
Linux поиск по содержимому файлов командой grep
Часто возникают ситуации, что нужно найти какой-нибудь текст, но вы не помните, в каком файле/файлах он содержится. Секрет популярности — её мощь, она отдает возможность пользователям сортировать и фильтровать текст на основе сложных правил.
Команда grep (расшифровывается как global regular expression print) — одна из самых востребованных команд в терминале Linux, которая входит в состав проекта GNU.
В этом варианте для поиска по содержимому файлов в каталоге можно использовать утилиту grep:
grep -r -n «text» /path
grep -r "Строчка для поиска"
grep -rl $'\xEF\xBB\xBF'
где:
-n показывает строку, где был найден фрагмент;
-r осуществляет розыск рекурсивно, в файлах в самом каталоге /path и в его подкаталогах;
Также можно приплюсовать опцию -C 3, чтобы видеть +- 3 строки вокруг (выше и ниже от найденной).
Дабы найти файл по его содержимому во всех Linux — подобных ОС, достаточно использовать утилиту find.
Linux поиск по содержимому файлов командой find
Своего рода швейцарским ножом в розыске файлов является команда find. Отметим, что она имеет множество опций, которые смогут кардинально изменять механизм поиска. Мы изложим лишь основные принципы, а с остальными способностями ознакомьтесь в справке по команде. Базовый принцип использования find состоит в указании папки поиска и опций. Например, выражение «find ~/ -name *.cpp» осуществит поиск файлов, имеющих продолжение «cpp» по всем каталогам, находящимся в личной директории пользователя.
/usr/bin/find /папка -type f -exec grep -H 'строчка для поиска' {} ;
Значение, указанное после опции -name, задает шаблон соотношения имени файла. Вы можете использовать опцию -type для указания типа файла, где в свойстве значений нужно использовать специальные буквы: d — директория, f — файл, l — символическая ссылка и т. д. Функции -user, -group и -size также довольно полезны. Их значениями являются имя пользователя, имя категории и размер файла в байтах.
find /var/www/ -name "file.conf"
find /var/www/ -name "*.conf"
С поддержкою опции -exec каждому файлу, предназначенному для установки соответствия, можно добавить случайную обработку. Таким образом, появляется возможность осуществления поиска, как по имени файла, так и по охватываемому. Ниже приводится пример комбинирования команды find и grep за счет использования функции -exec.
find ~/ -name *.cpp
find ~/ -name *.cpp -user 'my-username' -group 'my-group'
find ~/ -name '*.config' -type f -exec grep 'user' {} \;
find /home/ ( -name "*.php" -or -name "*.html" -or -name "*.js" )
-exec grep -lHEi $'\xEF\xBB\xBF' {} ;
А возможно и еще проще
Linux поиск по содержимому файлов командой which
Команда which ищет только те файлы, у которых есть право на выполнение как программы. Розыск осуществляется по директориям, заданным в переменной окружения PATH. Содержимое переменной PATH сможет отличаться для различных пользователей. Чтобы охватить как можно большее количество системных директория, необходимо войти в систему под учетной записью администратора.
which cat
/bin/cat
which docker-stack
/home/username/.local/bin/docker-stack
Linux поиск по содержимому файлов командой locate
Поиск, производимый командой locate весьма быстр. Однако учитывайте тот факт, что системная база данных может быть не живой на момент осуществления операции. Механизм сканирования файловой системы, время его проведения и вобщем наличие такого инструмента может разниться в различных дистрибутивах Linux. Команда locate может быть полезна лишь при поиске файла по его имени. Однако для проверки текстового содержимого документов на вступление искомых данных нужно использовать другой инструмент.
Команда locate представляется альтернативой для find.
Данная команда, как правило, работает быстрее и может с легкостью производить поиск (в широком смысле — стремление добиться чего-либо, найти что-либо; действия субъекта, направленные на получение нового или утерянного (забытого): новой информации (поиск информации), данных,) по всей файловой системы. Linux имеет специальную команду grep, какая принимает шаблон для поиска и имя файла (именованная область данных на носителе информации). В случае нахождения совпадений, они будут выведены в терминал. В всеобщем виде выражение можно составить как «grep шаблон_поиска имя_файла». Чтобы отыскать файлы с помощью команды locate, просто используйте следующий синтаксис:
locate query
К образцу, чтобы возвращать только файлы, содержащие сам запрос, вместо того чтобы вводить каждый файл, который содержит запрос в ведущих к нему каталогах, можно утилизировать флаг –b (чтоб искать только basename, базовое имя файла):
locate -b query
Команды find и locate – отличные инструменты для поиска файлов в UNIX‐подобных операционных системах. Любая из этих утилит имеет свои преимущества. Мы рассмотрели использование команд для поиска и фильтрации вывода команд в операционной системе Linux. При правильном применении эта утилита станет мощным инструментом в ваших руках. Несмотря на то, что команды find и locate сами по себе очень мощны, их действие возможно расширить, комбинируя их с другими командами. Научившись работать с find и locate, попробуйте чистить их результаты при помощи команд wc, sort и grep.

