В операционных системах семейства Linux все объекты ОС являются файлами. Это означает, что не только данные пользователя и настройки системы хранятся в файлах, но и различные механизмы управления системой и коммуникации основаны тоже на файлах. Поэтому поиск файлов очень важен и для новичков будет очень полезно узнать, как найти местоположение того или иного файла, будь то программа, изображение или документ.
В Linux существует множество способов поиска, как в графическом интерфейсе, так и через командную строку. В сегодняшней статье мы разберём, как выполнять поиск файла в Linux с помощью различных инструментов. Но начнём с программ, у которых есть графический интерфейс.
Содержание статьи
- Поиск файла в 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. Например:
Можно искать по содержимому только в файлах с определённым расширением или вхождением определённых символов в имя файла используя язык запросов. Синтаксис довольно простой: имя_поля:значение. Например, так можно найти все вхождения Losst в файлах, начинающихся на 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 различными способами, начиная от графического интерфейса и заканчивая терминалом. Как видите, здесь есть множество вариантов, которые позволят вам решить любые задачи по поиску файлов.
Поправка. Опция -r в grep это рекурсивный поиск. А поиском по содержимому grep занимается и без опций.
which
Я -- программист (-хренов). Пишу проги для микроконтроллеров и для компа. Очень часто после компиляции проекта, состоящего из многих файлов, компилятор выдаёт ошибки. Иногда приходится искать по проекту использование (вызовы) той или иной функции или какие-то другие вещи. Поэтому я интенсивно пользуюсь утилитой grep.
Набрать четыре буквы и к ним еще несколько параметров -- это не такая уж большая работа и не такая катастрофическая потеря времени. По сути (умеючи) всё осуществляется одним взмахом руки над клавиатурой.
Примеры:
grep -n lcd_init *.c # Поиск в исходных файлах проекта, где вызывается инициализация дисплея. Дополнительно к указании имени файла, опция -n также выводит номер строки.
grep -nr post_message *.[ch] # Поиск по всему проекту и его директориям (-r -- флаг рекурсивности просмотра поддиректориев) во всех исходных и хэдерных файлах.
grep -ni led *.c # опция -i заставляет игнорировать регистр буква искомого слова. В результате будут найдены все led, Led, LED, LED_ON, LED_OFF и так далее.
Кроме того, вывод команды grep можно "подкрасить". У меня Debian. А у него в домашнем директории пользователя в файле .bashrc имеется 82-ая строка вот с таким содержанием:
alias grep='grep --color=auto'
Эту строку нужно раскомментировать и перезапустить сессию пользователя.
(Можно очень много интересного написать по работе в Линуксе и можно дать много полезных советов. Линукс огромен, как вселенная! Обилие информации не приводит к увеличению скорости освоения. Вы же не наедаетесь за один раз и на всю неделю. Вы едите каждый день, но по немного. Вы каждую неделю тренируетесь в спортзале или выполняете какие-то силовые нагрузки периодически. Но вы не рвете жо и не губите своё здоровье, как "последний раз". Так и с освоением Линукса -- не нужны не авралы, а нужно методичное освоение. Мудрость гласит -- "Нет! Мы медленно спустимся в долину и возьмём всё стадо." Успехов вам!)
Тогда уж alias добавить в /etc/bash.bashrc, чтоб и для root-а было цветно 😉
А зоодно обратите внимание, сколько раз Вы ткнули в буковку "n", не проще так: alias grep='grep --color=auto -n'
1. А зачем? У root-а совсем иные задачи. Я под root-ом не имею привычки работать над проектами. Root предназначен совсем-совсем для иных целей. Это ж не Винда!
2. Ага. Можно и так. Вроде даже когда-то так тоже делал. А в целом, на брать дополнительно пару символов "-n" абсолютно не напрягает (руки-то не на мышке, а на клаве). Ну и есть волшебная клавиша "Tab", и история команд.
В общем, кому как нравится. Мне нравится так, и кроме того, я уже привык делать именно так. Никого не агитирую делать именно так, как я делаю. Просто предложил свой способ. А каждый сам найдёт для себя единственный удобный для него способ. Ага.
Ну, раз уж про цвет, то ещё чуток offtop-а: gcc у меня тоже цветной 😉 более удобочитаемый вывод 🙂
P.S.: прошу прощения за описочку: зоодно -> заодно 🙂
Ага. Я тоже "подкрасил".
Вот только все возможности в одну статью сваливать я подумал, что это не хорошо. Ну раз уж Вы затронули и этот вопрос, то добавлю.
Строки 86-87 в том же файле:
# colored GCC warnings and errors
export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
Согласен - дело вкуса, но можно и разнообразить: export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01;34:quote=33'
Это потому, Александр Антонович, что вам не хватает внутренней дисциплины и привычки комментировать свой код. Определили функцию в каком-то файле, сделали вызов функции в другом файле, напишите в файле с определением функции соответствующий комментарий с адресом файла, где есть вызов, комментарии для этого и нужны, чтобы потом не делать судорожные поиски и не блукать в трёх соснах под солнцем, но во тьме. Вы даже представить себе не можете, как облегчите свою жизнь в будущем, потратив 3 секунды на полезный комментарий. :))) При этом приставка к слову "программист", которой вы себя обзываете, сама отпадёт... Ни можно так про себя! ;)) Вас молодёжь читает... Пример ещё брать будет.
Ну и для описанного вами случая некоторые программистские IDE имеют соответствующие специализированные инструменты для поиска по проекту. Иногда это бывает удобней чем grep, хотя grep могуч конечно.
ANGRYsearch забыли.
Уважаемый Добряк!
Всё, что Вы говорите -- всё верно!
К сожалению, мои проекты довольно-таки большие. Проект, над которым я сейчас тружусь, насчитывают нескольку десятков файлов, в общей сложности чуть менее 10 тысяч строк. Хозяйство очень большое. Кроме того, это -- разработка. Постоянно что-то меняется, постоянно что-то куда-то переносится.
Ну, например, в схеме используется LCD (OLED) индикатор, микросхема Zig-Bee и вокодер. У всех у них интерфейс SPI. Но у микроконтроллера, который заложен в изделии, только два SPI. Выход простой -- нужно просто объединить два устройства на одном интерфейсе. Я посчитал, что радиоканал из них самый быстрый, и посадил его на один SPI, а LCD и вокодер завёл на другой SPI.
Оказалось, не угадал!
Оказалось, что Zig-Bee может ждать дольше обработки (после того, как микроконтроллер (МК) получит от неё прерывание), чем вокодер. Ну, LCD -- это товарищ вообще не принципиальный, но у него тоже есть неприятное свойство. Он -- графический. А это значит, что вывод информации для подновления изображения на нём потребует значительно больше времени, чем если бы он был символьным. Ну, в общем, вывод небольшого кусочка может занять 1-2 миллисекунды. Если МК начал работать с LCD, то ему не желательно прерваться на обработку вокодера, так как придётся заново выводить этот кусок изображения. С другой стороны, для вокодера 1-2 мс -- это существенное время, которое может нарушить его работу.
В общем, пришлось перемещать LCD от вокодера на радиоканал.
Простой (казалось бы!) вопрос -- в каком файле (модуле) должна осуществляться инициализация интерфейса SPI? Ну тот SPI, который работает на одно устройство, -- там понятно -- там можно проинициализировать его и в самом модуле устройства (в драйвере этого устройства). Например, радиоканал сидел на отдельном SPI, значит, можно SPI можно не выделять в отдельный файл, а объединить его с драйвером радиоканала. А, вот, что делать с вокодером и LCD?
Пришлось создавать три модуля драйверов: один для LCD, другой -- для вокодера, третий -- для их совместно используемого SPI.
Но это ещё ягодки! Потом, когда поднялся вопрос экономии питания, посыпались ягодки. Оказалось, что вокодер даже в режиме сна жрёт довольно-таки много. Пришлось отказаться от этого режима, а тупо отрубать ему питание. Получилось. Но возникла другая проблема.
По логике работы устройства возникают ситуации, когда LCD работает с выключенным вокодером. Но вокодер (собака!), будучи вообще обесточенным, умудряется получить питание и работать через сигнальные цепи, которые являются общими для LCD и вокодера.
Всё бы ничего, но оказалось, что и радиоканал тоже способен нормально запитываться от сигнальных цепей. По идее нужно менять МК на другой, у которого три SPI.
Добряк, я не прошу Вас вникать в описанную проблему. Я это всё не поленился написать для Вас, что бы развеять Ваше чувство, что чужую будку, руками разведу. Пожалуйста, не судите людей по себе. Проекты (программы) бывают чрезвычайно разные. Со стороны всегда кажется -- что там тупить-то!
Ещё бы..! :))))
Могу лишь добавить, что в файлменеджер nemo можно, в качестве расширения, добавить любой поисковик, например, тот же gnome-search-tool
Просто битва Титанов )))) Может Вам, ребятки, телефонами обменяться? )))
А как же Catfish? Тоже неплохая графическая приблуда для поиска.
ripgrep же!
mate-search-tool самый компактный и удобный для меня