Курс по сетевым технологиям
A A A

Поиск файлов 

Очень часто нам придется использовать поиск файлов или определенного текста в файлах. Для этого в 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) - инвертированный поиск, то есть будут отображаться только те записи, где искомое слово отсутствует.