В Linux есть масса утилит, для поиска файлов. К примеру всем известный монструозный find, который умеет даже тапочки приносить.
Но что, если мне нужно просто найти какой-то файл? Использовать find для такой простой задачи, это явно стрельба из пушки по воробьям. Для таких задач, как моя, есть более изящные решения.
И это решение, утилита locate.
Утилита locate используется для поиска файлов, расположенных на машине пользователя или на сервере. Фактически она выполняет ту же работу, что и команда find, однако, ведёт поиск в собственной базе данных.
Ключевая фраза здесь - в собственной базе данных. То есть применяя утилиту locate, поиск файлов будет осуществляться не по файловой системе, как это делает find. А будет использоваться собственная база данных. Коротая позволяет искать файлы со скоростью света.
Обновление базы данных locate происходит автоматически, как правило, раз в сутки. Либо можно запустить руками командой
Давай теперь потыкаем, запускай:
Ищем файлы, которые оканчиваются на «txt»
Ключ -с = вывести общее количество найденных файлов
Полезли в кишки, заводим strace.
Переходим в папку cd /tmp и создаем подопытный файл:
Так, я нахожусь в папке tmp и у меня создан файл
Мы вызываем внешнюю команду locate, но вызываем мы ее из интерпретатора bash. Вернее её вызывает сам интерпретатор. И это накладывает свои нюансы. В нашем случае этот нюанс «Подстановка имен файлов», то есть Globbing.
Сейчас будет сложно для понимания, но чуть ниже я разжую на человеческий.
Во времена UNIX V6, существовала программа /etc/glob, которая могла раскрывать шаблоны подстановки. Очень скоро она стала встроенной функцией командной оболочки.
Но что же случилось то в итоге, почему ничего не нашлось? А произошло следующее: после того, как интерпретатор обнаружил символ «*», который является спецсимволом и соответствует любой строке, интерпретатор попытался сделать подстановку Globbing и ему это удалось.
И при вызове команды locate она получила в качестве аргументов, результат этих подстановок. Давай посмотрим наглядно что произошло. Запускаем:
execve() выполняет программу, заданную параметром filename
Возвращаемся к выводу от strace и видим что locate получила в качестве аргумента
Вот лишь по этому на экран ничего не вывелось, когда я запустил
Если ты это усвоил, то уже не наступишь на грабли. Да и strace снова немного затронули, можешь применять для дебага и смотреть что происходит внутри, после вызова той или иной команды.
Поигрались и хватит. Пошли дальше работу работать. Всех был рад видеть, пока-пока!
tags: #bash #strace #debug
—
💩 @bashdays
Но что, если мне нужно просто найти какой-то файл? Использовать find для такой простой задачи, это явно стрельба из пушки по воробьям. Для таких задач, как моя, есть более изящные решения.
И это решение, утилита locate.
Утилита locate используется для поиска файлов, расположенных на машине пользователя или на сервере. Фактически она выполняет ту же работу, что и команда find, однако, ведёт поиск в собственной базе данных.
Ключевая фраза здесь - в собственной базе данных. То есть применяя утилиту locate, поиск файлов будет осуществляться не по файловой системе, как это делает find. А будет использоваться собственная база данных. Коротая позволяет искать файлы со скоростью света.
Обновление базы данных locate происходит автоматически, как правило, раз в сутки. Либо можно запустить руками командой
updatedb
.Давай теперь потыкаем, запускай:
locate txtИщем все файлы, имена которых содержат «txt». Опа, меньше чем за секунду команда нашла все подходящие файлы, которые можно было найти. А если сделать это через find, то это у меня это заняло 18 секунд. Разница очень ощутимая.
Ищем файлы, которые оканчиваются на «txt»
locate '*txt'А теперь давай посчитаем общее количество файлов, которые нашлись
locate -ic '*txt'Ключ -i = режим регистронезависимости
Ключ -с = вывести общее количество найденных файлов
Полезли в кишки, заводим strace.
Переходим в папку cd /tmp и создаем подопытный файл:
> hello.txt
Знал же что пустой файл можно создать через символ «>»? Если нет, то теперь знаешь.Так, я нахожусь в папке tmp и у меня создан файл
hello.txt
запускаю:locate *txtОпа, ничего нет, как так? Мы же уже запускали ранее это, чтобы найти все файлы, которые заканчиваются на txt. Что случилось?
Мы вызываем внешнюю команду locate, но вызываем мы ее из интерпретатора bash. Вернее её вызывает сам интерпретатор. И это накладывает свои нюансы. В нашем случае этот нюанс «Подстановка имен файлов», то есть Globbing.
Сейчас будет сложно для понимания, но чуть ниже я разжую на человеческий.
Во времена UNIX V6, существовала программа /etc/glob, которая могла раскрывать шаблоны подстановки. Очень скоро она стала встроенной функцией командной оболочки.
Но что же случилось то в итоге, почему ничего не нашлось? А произошло следующее: после того, как интерпретатор обнаружил символ «*», который является спецсимволом и соответствует любой строке, интерпретатор попытался сделать подстановку Globbing и ему это удалось.
И при вызове команды locate она получила в качестве аргументов, результат этих подстановок. Давай посмотрим наглядно что произошло. Запускаем:
strace -e execve locate *txtНа выходе получаем:
execve("/usr/bin/locate", ["locate", "hello.txt"], 0x7ffe242252d8 /* 27 vars */) = 0Опция «e» и аргумент «execve» сообщают strace, что я хочу отслеживать только системные вызовы «execve».
execve() выполняет программу, заданную параметром filename
Возвращаемся к выводу от strace и видим что locate получила в качестве аргумента
hello.txt
И теперь locate будет искать файлы именно по этому шаблону, а не по тому, что мы с тобой ожидали, когда писали «*txt».Вот лишь по этому на экран ничего не вывелось, когда я запустил
locate *txt
А чтобы этого не происходило всегда используй quoting (кавычки) и будешь получать ожидаемый результат.locate '*txt'Механизм подстановки имен файлов (Globbing) на самом деле удобен, просто нужно использовать его по назначению.
Если ты это усвоил, то уже не наступишь на грабли. Да и strace снова немного затронули, можешь применять для дебага и смотреть что происходит внутри, после вызова той или иной команды.
Поигрались и хватит. Пошли дальше работу работать. Всех был рад видеть, пока-пока!
tags: #bash #strace #debug
—