В операционных системах семейства Linux все объекты ОС являются файлами. Это означает, что не только данные пользователя и настройки системы хранятся в файлах, но и различные механизмы управления системой и коммуникации основаны тоже на файлах. Поэтому поиск файлов очень важен и для новичков будет очень полезно узнать, как найти местоположение того или иного файла, будь то программа, изображение или документ.
В Linux существует множество способов поиска, как в графическом интерфейсе, так и через командную строку. В сегодняшней статье мы разберём, как выполнять поиск файла в Linux с помощью различных инструментов. Но начнём с программ, у которых есть графический интерфейс.
Поиск файла в Linux через графический интерфейс
В популярных графических окружениях рабочего стола таких как Gnome или KDE поддерживается поиск файлов прямо в главном меню. Этот поиск выполняется реальном времени и ищет только в самой домашней папке и в нескольких стандартных подпапках, таких как Документы, Загрузки и т д. Кроме того, большинство файловых менеджеров поддерживают поиск файла в выбранной папке и её подпапках. Я не буду рассматривать это в данной статье. Вместо этого давайте сосредоточимся на утилитах, которые позволяют выполнять расширенный поиск файлов.
1. Catfish
Это простая программа для поиска файлов. В ней можно выбрать тип файла для поиска, а также время его изменения. Программа ищет по всей файловой системе, поэтому это может занять довольно много времени. Она ищет не в реальном времени, а использует поисковый индекс mlocate. Вы можете установить Catfish в Ubuntu используя такую команду:
sudo apt install catfish
После запуска программы вы можете сразу же набрать нужный запрос в строке поиска и нажать кнопку со значком лупы, например file1:

Если вы хотите найти только файлы измененные сегодня, выберите пункт Custom в левой части окна. Или же вы можете вручную указать интервал, в котором должна находится дата изменения:

Кроме того, утилита поддерживает поиск по содержимому. Для этого нужно включить галочку Search file contents в настройках:

2. FSearch
Это инструмент для поиска файлов по имени работающий также как и Everything Search Engine. При первом запуске необходимо создать индекс для поиска на основе папок, в которых вы собираетесь искать файлы. Затем вы будете получать результаты поиска сразу же при вводе текста. Программа поддерживает модификаторы по типу файла, символы подстановки, операторы И/ИЛИ, регулярные выражения, сортировку по типу и размеру, а также многое другое. Вы можете найти информацию о том как установить FSearch в вашем дистрибутиве на странице программы на GitHub. При первом запуске окно программы выглядит вот так:

После запуска программы необходимо нажать кнопку Add Folders и добавить папки, в которых вы хотите выполнять поиск с помощью кнопки со значком плюса:

Также здесь можно настроить параметры поискового индекса и частоту его обновления. Позже, индекс можно настроить открыв Edit -> Preferences -> Database. После этого вы можете просто начать набирать имя файла в поисковой строке и он сразу же появится в списке:

Можно использовать модификатор по типу файла, например pic: для картинок:

Кроме того доступны такие модификаторы типа файла: file, folder, app, archive, audio, doc, video. Также можно использовать регулярные выражения с помощью модификатора regex:

Или искать по размеру с помощью модификатора size:

Вы можете найти все остальные модификаторы поиска на этой странице.
Существует ещё одна похожая утилита для поиска - это AngrySearch. Но она уже давно не обновлялась и её функциональность примерно такая же как и у fsearch, поэтому я не буду рассматривать её в этой статье.
3. Recoll
Это приложение тоже может выполнять поиск файлов Linux не только по имени, но и по их содержимому. Здесь используется полнотекстовый поисковый движок Xapian. Как и в предыдущем варианте необходимо сначала создать поисковый индекс. Для этого нажмите кнопку Indexing Configuration:

В открывшемся окне вы можете добавить папки, в которых будет выполняться поиск в разделе Top-Level Directories, а также, поскольку это полнотекстовый индекс, то можно подключить словари словоформ для вашего языка в разделе Stemming Languages. По умолчанию выбрана только ваша домашняя папка:

Когда все настройки будут внесены, нажмите кнопку Ok, а затем Start the indexing process. В приложении доступно четыре варианта поисковых запросов:
- Any word - вхождение хотя бы одного слова из запроса в имя или содержимое;
- All words - вхождение всех слов из запроса в имя или содержимое;
- File name - поиск только по имени файла;
- Query language - позволяет формировать сложные запросы с помощью языка запросов Xapian.
Для поиска файлов по имени в Linux выберите тип поиска File Name, и наберите запрос. Например:

Для поиска по содержимому выберите Any Word, All Words, или Query Language. Например:

Можно искать по содержимому только в файлах с определённым расширением или вхождением определённых символов в имя файла используя язык запросов. Синтаксис довольно простой: имя_поля:значение. Например, так можно найти все вхождения kovalets в файлах, начинающихся на file:

Более подробную информацию про все возможные модификаторы можно найти в официальной документации.
Поиск файлов в Linux по имени через терминал
Если графические утилиты предназначены для обычных пользователей и поиск в домашней папке, то консольные программы предоставляют более гибкие возможности поиска для всех файлов, включая системные и виртуальные и часто используются администраторами и разработчиками.
1. find
Самая часто используемая команда поиска файла Linux на данный момент - это find. Она имеет множество возможностей: вы можете искать файлы по имени, дате изменения или создания, использовать регулярные выражения и маски, выполнять определённые действия для найденных файлов, настраивать глубину поиска и многое другое.
По умолчанию команда find ищет и файлы и каталоги. Если папку не задать явно, то поиск будет выполняться в текущей папке. Указать что нужно искать именно файлы можно с помощью опции -type с параметром f, а сам запрос надо указать с помощью опции -name. Например:
find -type f -name "file"

Обратите внимание, что find будет искать файлы, имя которых точно совпадает с вашим запросом. Если вам нужно найти файлы которые содержат определённые символы в имени, используйте символы подстановки, например *:
find -type f -name "file*"

Папку для поиска нужно указать перед остальными параметрами. Например, для того чтобы найти все файлы, которые начинаются на pa в папке /etc/ используйте такую команду:
sudo find /etc/ -type f -name "pa*"

Для того чтобы не учитывать регистр символов при поиске, используйте опцию -iname вместо -name:
sudo find /etc/ -type f -iname "pa*"

Если вы хотите найти файлы только с определённым расширением, это можно сделать указав звездочку перед запросом. Например, для того чтобы получить все файлы .ini выполните:
sudo find /etc/ -type f -name "*.ini"

Более подробную информацию об этой команде читайте в статье команда find в Linux.
2. fd
Это альтернатива команды find, написанная на Rust. Она работает быстрее оригинальной find, поддерживает цветной вывод, поиск по регулярным выражениям, не учитывает скрытые файлы и файлы, перечисленные в .gitignore а также имеет более простой и удобный синтаксис. В Ubuntu утилиту можно установить с помощью следующей команды:
sudo apt install fd-find
Обратите внимание, что в Ubuntu эта команда пишется не fd, как задумали разработчики, а fdfind.
Как и find, эта утилита по умолчанию ищет в текущей папке, но вместо точного сопоставления имени, она ожидает часть имени или регулярное выражение. Например, для того чтобы найти все файлы в текущей папке, которые содержат слово file в имени достаточно команды:
fdfind file

Далее, для того чтобы найти файлы имя которых начинается на pa в папке /etc/ используйте такую команду:
sudo fdfind "^pa" /etc/

Если вам нужно искать файлы по расширению, используйте опцию -e. Например, для поиска всех ini файлов содержащих в имени букву x в папке /etc/ выполните:
sudo fdfind -e ini "x" /etc/

Более подробную информацию об утилите можно найти на её странице GitHub.
3. fzf
Команда fzf предназначена для живого нечеткого поиска файлов по имени. При запуске она показывает список файлов в текущей папке и строку поиска, куда вы можете вводить поисковый запрос, для того чтобы уменьшить количество этих файлов. Список фильтруется в реальном времени и всё работает довольно быстро. Для установки программы в Ubuntu можно использовать такую команду:
sudo apt install fzf
Когда утилита установлена, нужно перейти в папку, в которой вы хотите выполнять поиск. Например, в папку /etc/:
cd /etc/
Теперь запустите утилиту и наберите запрос pass, для того чтобы найти все файлы содержащие в названии pass:
fzf

Наиболее точные совпадения будут ниже всего. Вы можете перемещаться по списку файлов с помощью клавиш вверх и вниз. Для выхода нажмите Enter, и путь к выбранному в данный момент файлу будет выведен в терминал:

Если вы хотите искать вхождения только с начала имени файла, используйте символ ^ перед запросом:

А если только с конца, то символ $. Более подробную информацию можно найти в официальной документации.
4. skim
Это ещё одна утилита для нечеткого поиска в Linux в реальном времени, написанная на Rust. Она может делать почти всё то же самое что и fzf, но более легковесная. Утилиты нет в официальных репозиториях Ubuntu, но вы можете установить её с помощью cargo:
cargo install skim
Как и при использовании fzf вам нужно перейти в папку, в которой будет выполняться поиск. Например:
cd /etc/
Теперь вы можете запустить программу и начать вводить поисковый запрос:
sk

По списку найденных файлов можно перемещаться с помощью клавиш стрелка вверх и вниз. В отличие от fzf здесь также поддерживается командный режим, который позволяет добавить дополнительный уровень фильтрации комбинируя skim с grep или другой утилитой для поиска файлов. Просто укажите команду с помощью опции -c. Например:
sk --ansi -c 'grep -r "{}" .'
После выполнения команды вы увидите не только имена файлов но и их содержимое. Здесь вы можете отфильтровать файлы по имени. Например, только содержащие в пути init.d:

А затем, переключитесь в командный режим с помощью сочетания клавиш Ctrl+Q и наберите запрос уже для поиска по содержимому:

Или же сразу можно перейти в командный режим добавив опцию -i к команде запуска:
sk --ansi -i -c 'grep -r "{}" .'
5. locate
Команда locate считается устаревшей и уже была удалена из многих дистрибутивов. Она выполняет поиск не в реальном времени, как find, а по ранее созданной базе файлов, но она делает только поиск файла по имени Linux. Вы вводите слово, которое вас интересует, и утилита выдаёт все известные ей файлы, имя которых содержит такое слово. Можно использовать регулярные выражения. Например, найдем все файлы, в имени которых содержится passwd:
locate passwd

Обратите внимание, что если файл был добавлен после создания базы, то он найден не будет. Для обновления поискового индекса locate используйте такую команду:
sudo updatedb
Более подробно об этой утилите можно прочитать в статье Команда locate в Linux.
Поиск файлов по содержимому в в терминале
Существует несколько консольных утилит для поиска файлов по их содержимому и они будут подробно описаны в отдельной статье. Это SilverSearcher, ripgrep, ack и другие. Но исторически так сложилось, что самая популярная и часто используемая утилита для поиска текста по файлам это grep. Она поставляется во всех популярных дистрибутивах по умолчанию и её возможностей хватает для большинства задач.
Для того чтобы найти файлы, которые содержат определённую строку достаточно использовать опцию -r и указать папку, в которой надо искать текст. Например, давайте найдём все файлы в /etc/, которые содержат строчку error_reporting:
sudo grep -r "error_reporting" /etc/

С помощью grep очень удобно искать, где находится нужный конфигурационный файл или же проверять не содержат ли файлы с кодом чего-нибудь подозрительного. Подробнее про использование grep читайте в статье команда grep в Linux.
Как узнать расположение исполняемого файла Linux
Это можно сделать с помощью команды whereis. Эта команда достаточно простая и решает только одну задачу. Она показывает, где находится исполняемый файл, переданной ей программы. Например, если мы хотим узнать, в какой папке расположен grep, достаточно выполнить:
whereis grep

Выводы
В этой статье мы разобрали, как выполнить поиск файла в Linux различными способами, начиная от графического интерфейса и заканчивая терминалом. Как видите, здесь есть множество вариантов, которые позволят вам решить любые задачи по поиску файлов.