Linux предлагает более одного способа найти то, что вы ищете, включая такие команды, как locate, find и whereis. Знание того, когда и какую команду использовать, может сэкономить вам время и нервы. Давайте углубимся в каждый из них и посмотрим, какой из них работает лучше в разных ситуациях.
Команда поиска
Команда locate предназначена для поиска файлов и каталогов по их именам или частям их имен — практически мгновенно. Она невероятно быстра, поскольку на самом деле не выполняет поиск в вашей файловой системе в реальном времени. Вместо этого она запрашивает заранее созданную базу данных, обычно называемую mlocate.db, plocate.db или просто locate.db, в зависимости от вашего дистрибутива.
Эта база данных не обновляется в режиме реального времени. Если вы только что создали или удалили файл, locate может не узнать об этом до следующего обновления базы данных. База данных регулярно обновляется системным процессом, обычно через задание cron, которое запускается ежедневно. Вы также можете вручную обновить базу данных с помощью «sudo updatedb», хотя индексация всей файловой системы может занять некоторое время.
Базовый синтаксис на удивление прост:
найти -i имя файла
Если файл существует и база данных актуальна, locate выведет список всех путей, содержащих «my_script.sh». Параметр -i делает поиск нечувствительным к регистру.
Вы также можете искать все файлы с определенным расширением, подсчитывать совпадения с помощью опции -c или ограничивать вывод с помощью опции -n. Команда locate поддерживает сопоставление шаблонов с подстановочными знаками и даже базовые регулярные выражения, предлагая больше контроля над вашими поисками.
locate против mlocate против plocate
Со временем в большинстве дистрибутивов первоначальная утилита locate была заменена на mlocate, которая внесла важные улучшения, такие как соблюдение прав доступа пользователя, поэтому вы видите только те файлы, к которым вам разрешен доступ.
Когда mlocate установлен, он сам предоставляет команду locate. Так что даже если вы вводите locate, вы фактически запускаете mlocate в фоновом режиме. Вы можете убедиться в этом, проверив версию:
найти —версия
Это покажет, какая версия locate обрабатывает ваши поисковые запросы.
Совсем недавно в некоторых дистрибутивах появилась новая реализация plocate, которая начала заменять mlocate. plocate быстрее и эффективнее, используя сжатый индекс для сокращения времени поиска и использования диска — особенно полезно в системах с большим количеством файлов. Например, Fedora теперь использует plocate по умолчанию, и многие другие дистрибутивы начинают следовать этому примеру.
Вы также можете установить plocate с помощью менеджера пакетов по умолчанию, например, в Ubuntu, запустив:
sudo apt установить местоположение
Опять же, даже если plocate установлен, команда, которую вы вводите, остается locate, поэтому ничего не меняется в том, как вы ее используете. Для большинства пользователей функциональность и синтаксис одинаковы. Однако несколько дополнительных опций могут немного отличаться между mlocate и plocate.
Команда поиска
В отличие от команды locate, команда find ищет файлы и каталоги в реальном времени, напрямую проходя по указанной вами иерархии каталогов. Она не полагается на базу данных, что означает, что она всегда возвращает самую актуальную информацию. Однако это также означает, что она может быть медленнее, чем locate, особенно при поиске в больших файловых системах.
Find выделяется своей способностью выполнять поиск по широкому спектру критериев — не только по имени, но и по типу, размеру, разрешениям, владельцу, времени изменения и многому другому. Как будто этого недостаточно, find также может выполнять произвольные команды (например, rm, cp или chmod) для найденных файлов с помощью параметра -exec.
Вот основной синтаксис:
найти [путь] [опции] [выражение]
- путь: Где начать поиск (используйте . для текущего каталога)
- варианты и выражения: На что обращать внимание и как фильтровать результаты
Например, чтобы найти файл с именем config.xml в вашем домашнем каталоге и его подкаталогах, выполните:
найти /home/your_username -name «config.xml»
Подобно locate, find может выполнять поиск без учета регистра, используя опцию -iname (нечувствительное имя):
найти /var/log -iname «error*.log»
Это позволит найти такие файлы, как error.log, Error.Log и ERROR-messages.log в /var/log.
Вы также можете искать определенные типы файлов. Например, чтобы найти все каталоги (d) в текущем пути, используйте:
найти . -тип d
Или вы можете найти файлы большего размера, чем любой другой, например, 100 МБ (+100 МБ) в вашем каталоге /opt с помощью:
найти /opt -размер +100M
Кроме того, вы можете искать пустые файлы, пустые каталоги или элементы на основе их определенного времени изменения. Вы также можете выполнять другие команды для каждого файла, найденного с помощью find, например, удалять все файлы .tmp с помощью этого:
найти . -имя «*.tmp» -exec rm {} ;
Команда whereis
Команда whereis сильно отличается от locate и find. В то время как первые две являются инструментами поиска файлов общего назначения, у whereis есть очень конкретная миссия: найти двоичные (исполняемые) файлы, исходные файлы и страницы руководства для заданной команды.
Это особенно полезно, когда вы пытаетесь понять, как команда установлена в вашей системе, или когда вы устраняете неполадки, связанные с выполнением программы.
В отличие от locate и find, whereis выполняет поиск только в предопределенном наборе каталогов, где обычно хранятся эти типы файлов — такие места, как /bin, /usr/bin и /usr/local/bin для двоичных файлов; /usr/share/man для страниц руководств; и различные каталоги исходного кода.
Например, если вы хотите найти двоичный файл ls, его исходный код (если доступен) и его страницы руководства, вы можете выполнить:
где ls
Это сообщит вам, что двоичный файл ls находится в «/bin/ls», а его страница руководства — в «/usr/share/man/man1/ls.1.gz».
Если вас интересует только путь к исполняемому файлу, используйте опцию -b (двоичный):
где -b ls
Чтобы найти только страницы руководства, используйте опцию -m (man):
где -m bash
Вы также можете спросить whereis о нескольких командах одновременно:
whereis grep sed awk
Часто исходные файлы не устанавливаются по умолчанию. В таких случаях вывод может включать только имя команды, если исходный код не найден в стандартных расположениях.
Когда использовать каждую команду
Вы можете использовать команду locate, когда вам нужен быстрый обзор по всей системе, где существуют определенные файлы с определенным именем. Кроме того, это работает лучше всего, когда вы достаточно уверены, что файл не является совершенно новым, или вы недавно обновили базу данных.
С другой стороны, команда find больше подходит, когда вам нужно искать на основе критериев, отличных от имени, таких как размер файла, тип, разрешения или дата изменения. Это особенно полезно, когда вы хотите выполнить глубокий поиск в определенном дереве каталогов или когда файл, который вы ищете, может быть новым и еще не включенным в базу данных locate. find также хорош, когда вам нужны результаты в реальном времени или вы хотите выполнить такие действия, как удаление, копирование или изменение разрешений для найденных файлов.
Команда whereis полезна, когда вам нужно найти исполняемый двоичный файл команды, исходные файлы или страницы руководства. Она особенно полезна, когда вы устраняете неполадки с PATH вашей системы или пытаетесь понять, где и как установлена программа.
Иногда ваши потребности могут пересекаться между всеми тремя командами. Например, если locate возвращает слишком много результатов, вы можете использовать его вывод, чтобы сузить начальный путь для более точного поиска. Эти команды не являются взаимоисключающими — они лучше всего работают, когда используются вместе как часть вашего инструментария Linux.