Поиск файлов

Очень часто нам придется использовать поиск файлов или определенного текста в файлах. Для этого в Linux есть несколько достаточно мощные утилиты.

 

Поиск по имени файла:

locate [опции] имя_файла

Очень быстрая утилита и позволяет искать название файла в индексируемой базе данных. Каждый день система заносит новые названия файлов в базу данных и удаляет уже неактуальные записи.

Система индексирует абсолютно все файлы либо только определенные?

Абсолютно все файлы. Однако следует учитывать, что если файл новый, а система еще не успела его проиндексировать, то команда locate его не найдет.

То есть придется ждать пока она это сделает?

Необязательно. Можно принудительно обновить базу данных с помощью команды updatedb.

А где находится эта база данных?

Здесь — /var/lib/mlocate/mlocate.db. Необходимо обладать правами root для доступа к этому файлу.

Попробуем найти файлы, в имени которого присутствует слово user. Для этого введем следующую команду:

locate user

Поиск файлов, в названии которых присутствует слово user

Чтобы имя файла точно соответствовало заданному шаблону поиска достаточно ввести:

locate -b user либо locate —basename user

Для того, чтобы не учитывать регистр (то есть заглавные и прописные буквы в имени файла) достаточно ввести:

locate -i имя_файла  либо locate —ignore-case имя_файла

После этого система отобразит  имена файлов с заглавными и прописными буквами.

Иногда результат поиска выдает большое число записей. В данном случае можно перенаправить вывод на вход  команды less.

 

Поиск фрагментов текста в текстовых файлах

Бывают ситуации, когда мы не знаем название файла, но знаем его содержимое. В данном случае будет полезна функция поиска файлов по его содержимому и в этом нам поможет следующая утилита:

grep [опции] шаблон файл

Для этого рассмотрим текстовый файл Linux.txt и попробуем найти слово configuration в его тексте:

grep configuration Linux.txt

Отображение фрагмента текста в файле

Команда вывела сами строки, где встречается искомое слово.

А если текст содержит тысячи строк, то как найти эту строку в файле?

Для этого есть опция -n или —line-number

grep -n configuration Linux.txt

Отображение номеров строк

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

А можно осуществить поиск в нескольких файлах или по всей системе?

Конечно, с помощью символов групповых операций.

К примеру,  у нас 4 файла, в именах которых присутствует слово manual:

Список файлов, название которых содержит слово manual

Какую команду введем? Конечно же grep -n configuration *manual*.txt

Поиск по всем файлам

Как видно сначала выводится название файла, за ним номер строки и затем сама строка с искомым словом.

Ну а если у имен этих файлов нет общих слов, то как осуществить поиск?

Достаточно ввести grep -n configuration *.

Когда используется данная комбинация, то grepищет только в текущем каталоге! То есть вложенные каталоги не учитываются.

Чтобы учесть и вложенные подкаталоги необходимо использовать опцию -R или —dereference-recursive.

 

Как мы уже заметили система уже выделила красным цветом искомое слово, чтобы лучше ориентироваться. Однако не всегда система по умолчанию выделяет цветом искомое слово. Поэтому в такой ситуации используем  опцию —color=auto. Выглядет это так:

grep  —color=auto configuration *

 

Ну а если вдруг понадобится знать в каких файлах находится искомый текст и ничего больше, то воспользуемся опцией -l либо —files-with-matches:

grep -Rl  configuration *

Отображение списка файлов с искомым текстом

Команду grep удобно использовать и с другими командами, например ls.

Допустим мы хотим отобразить только файлы с расширением txt. Для этого выполним ls  | grep —color=auto txt

Подсвечивание искомых файлов

 

Вариантов применения grep с другими командами очень много и по мере прохождения курса можно придумать довольно интересные комбинации.

Для данной команды доступны следующие опции:

-i (—ignore-case) — не учитывается регистр

-w (—word-regexp) — при поиске учитывается целое имя, то есть отображаются записи, в точности соответствующие заданному шаблону.

-v (—invert-match) — инвертированный поиск, то есть будут отображаться только те записи, где искомое слово отсутствует.