Команда locate в Linux – это мощная утилита для быстрого поиска файлов и каталогов по их именам. Она использует предварительно созданную базу данных, которая обычно периодически обновляется программой updatedb команда для выполнения быстрого поиска, что делает его значительно быстрее других поисковых инструментов, таких как find. Когда пользователь вводит команду locate, сопровождаемую шаблоном поиска, она сканирует эту базу данных, а не саму файловую систему, предоставляя результаты практически мгновенно. Это делает locate особенно полезным для системных администраторов и пользователей, которым нужно быстро найти файлы без необходимости сканирования файловой системы. Однако точность работы locate зависит от частоты обновления базы данных, поскольку она может не отражать последние изменения в файловой системе до следующего обновления.
В этом руководстве мы расскажем о команде locate на понятных примерах. Обратите внимание, что все приведенные здесь инструкции/примеры были протестированы на Ubuntu 24.04.
1. Установите команду locate
Команда locate не поставляется предустановленной в Ubuntu и Debian Linux. Вы можете установить ее с помощью этой команды:
sudo apt install locate
Locate выполняет поиск файлов на основе предварительно скомпилированной базы данных имен файлов, что делает его гораздо быстрее, чем, например, команда find при последующих поисках. Но прежде чем мы сможем использовать эту команду, нам нужно будет создать и обновить базу данных файлов. Выполните следующую команду, чтобы создать базу данных locate:
sudo updatedb
Теперь мы готовы начать использовать locate.
2. Как использовать команду locate в Linux
Команда locate очень проста в использовании. Вам просто нужно передать имя файла, который вы хотите найти.
locate [filename]
Например, если нужно найти все имена файлов, в которых есть строка ‘dir2’, то это можно сделать с помощью команды locate следующим образом:
Примечание: Команда ‘locate dir2’ (без звездочек) также подойдет, поскольку locate неявно заменяет переданное имя (скажем, NAME) на *NAME*.
3. Как работает команда locate, или почему она такая быстрая
Команда locate работает так быстро, потому что она не читает файловую систему для поиска имени файла или каталога. Она обращается к базе данных (подготовленной командой updatedb), чтобы найти то, что ищет пользователь, и на основе этого поиска выдает результат.
Несмотря на то что это хороший подход, у него есть свои недостатки. Главный из них заключается в том, что после создания каждого нового файла или каталога в системе необходимо обновлять базу данных инструмента, чтобы он работал корректно. В противном случае команда не сможет найти файлы/каталоги, созданные после последнего обновления базы данных.
Например, если я попытаюсь найти файлы с именами, содержащими строку ‘tosearch’, в каталоге ‘Downloads’ моей системы, то команда find команда выдает один результат:
Но когда я пытаюсь выполнить тот же поиск с помощью команды locate, он не дает никакого результата.
Это означает, что база данных, в которой ищет locate, не была обновлена после создания файла в системе. Поэтому давайте обновим базу данных, что можно сделать с помощью команды updatedb команду. Вот как это делается:
sudo updatedb
И теперь, когда я снова запускаю ту же команду locate, она показывает файлы в выводе:
Аналогично, после удаления файла или каталога необходимо убедиться, что база данных locate была обновлена, так как в противном случае команда будет продолжать показывать этот файл в результатах поиска.
4. Как заставить locate выводить на экран число или количество совпадающих записей
Как мы видели, команда locate выводит на экран имена найденных файлов и их полные или абсолютные пути. Но если вы хотите, вы можете использовать инструмент для подавления всей этой информации и просто вывести число или количество совпадающих записей. Это можно сделать с помощью команды -c опция командной строки.
5. Как заставить locate печатать только те записи, которые соответствуют существующим файлам
Как мы уже обсуждали ранее в этой статье, если файл удален из системы, то пока вы не обновите базу данных locate, команда будет продолжать показывать это имя файла в выводе. Однако в данном конкретном случае можно пропустить обновление базы данных и все равно получить корректные результаты на выходе, используя команду -e опция командной строки.
Например, я удалил файл ‘filetosearch.txt’ из своей системы. Это подтвердила команда find, которая больше не могла найти этот файл:
Но когда я выполнил ту же операцию с помощью locate, файл все равно отобразился в выводе:
И мы знаем, почему – потому что база данных команды locate не была обновлена после удаления файла. Однако, используя команду -e :
Вот что говорится об этой опции на странице locate man: “Печатать только те записи, которые относятся к файлам, существующим на момент запуска locate”.
6. Как заставить locate игнорировать различия регистров
По умолчанию операция поиска, выполняемая командой locate, чувствительна к регистру. Но вы можете заставить инструмент игнорировать различия регистра, используя параметр -i опция командной строки.
Например, у меня в системе есть два файла с именами ‘newfiletosearch.txt’ и ‘NEWFILETOSEARCH.txt’. Как видите, имена файлов одинаковые, просто регистры у них разные. Если вы спросите найти для поиска, скажем, “*tosearch*”, то в выводе будет показано только строчное имя:
Но использование параметра командной строки -i заставляет команду игнорировать регистр, и в выводе появляются оба имени файлов:
7. Как разделить выходные записи с помощью ASCII NUL
По умолчанию выходные записи, которые выдает команда locate, отделяются друг от друга символом новой строки (\n). Но если вы хотите, вы можете изменить разделитель и вместо новой строки использовать ASCII NUL. Это можно сделать с помощью команды -0 опция командной строки.
Например, я выполнил ту же команду, которую мы использовали в последнем разделе, но добавил параметр командной строки -0:
Таким образом, вы видите, что разделителя новой строки больше нет – он заменен на NUL.
8. Как просмотреть информацию о базе данных locate
Если вы хотите узнать, какую базу данных использует locate, а также другую статистику о базе данных, воспользуйтесь командой -S опция командной строки.
9. Как искать точное имя файла с помощью locate
По умолчанию, когда вы ищете имя файла с помощью locate, переданное вами имя – скажем, NAME – неявно заменяется на *NAME*. Например, если я ищу имя файла ‘testfile’, то все имена, соответствующие *testfile*, будут выведены на экран:
Но что делать, если требуется найти файлы с именами, точно совпадающими с ‘testfile’? В этом случае вам придется использовать регулярные выражения, которые можно включить с помощью функции -r опция командной строки. Итак, вот как вы можете искать только ‘testfile’ с помощью регулярных выражений:
locate -r /testfile$