Поиск файлов
Очень часто нам придется использовать поиск файлов или определенного текста в файлах. Для этого в Linux есть несколько достаточно мощные утилиты.
Поиск по имени файла:
locate [опции] имя_файла
Очень быстрая утилита и позволяет искать название файла в индексируемой базе данных. Каждый день система заносит новые названия файлов в базу данных и удаляет уже неактуальные записи.
Система индексирует абсолютно все файлы либо только определенные?
Абсолютно все файлы. Однако следует учитывать, что если файл новый, а система еще не успела его проиндексировать, то команда locate его не найдет.
То есть придется ждать пока она это сделает?
Необязательно. Можно принудительно обновить базу данных с помощью команды updatedb.
А где находится эта база данных?
Здесь — /var/lib/mlocate/mlocate.db. Необходимо обладать правами root для доступа к этому файлу.
Попробуем найти файлы, в имени которого присутствует слово user. Для этого введем следующую команду:
locate 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:
Какую команду введем? Конечно же 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) — инвертированный поиск, то есть будут отображаться только те записи, где искомое слово отсутствует.