4.2 Поиск файлов в файловой системе Linux (Finding Files in the Linux File System)¶
Одна из моих главных слабостей — ужасная память. Вы можете позвонить мне и сообщить что-то важное, но к тому моменту, как я положу трубку, я уже практически наверняка забуду, что вы говорили. Это особенно неловко, когда встречаешь человека, с которым знаком и работаешь много лет, и вдруг обнаруживаешь, что не можешь вспомнить его имя.
К сожалению, эта забывчивость переносится и на работу. Я не могу сосчитать, сколько раз я создавал файл, сохранял его и тут же забывал, куда именно. Чтобы помочь таким людям, как я, Linux предоставляет утилиты для поиска файлов в файловой системе. В этой части главы вы узнаете о следующем:
- Использование
find - Использование
locate - Использование
which - Использование
whereis - Использование
type
Начнём с изучения утилиты find.
Использование find (Using find)¶
Утилита find — превосходный инструмент для поиска по файловой системе Linux. Чтобы воспользоваться ею, введите в приглашении командной строки find путь -name "имя_файла". Замените путь на место в файловой системе, с которого следует начать поиск, а имя_файла — на имя искомого файла.
Совет
Не забывайте использовать кавычки!
Для расширения результатов поиска можно использовать регулярные выражения, в частности подстановочный знак *. Например, предположим, что вы хотите найти все файлы журналов с расширением .log, хранящиеся в файловой системе. Для этого введите find / -name "*.log". Утилита find найдёт все файлы с расширением .log, начиная с корневого каталога файловой системы и обходя все подкаталоги. Это показано на рис. 4-6.

Рис. 4-6. Использование утилиты find для поиска файлов
Утилита find гибка в применении. Можно использовать параметр -user "имя_пользователя" для поиска файлов, принадлежащих определённому пользователю, или параметр -size "размер" для поиска файлов заданного размера. Знак + перед значением размера позволяет искать файлы, превышающие указанный размер, а знак - — файлы меньше указанного. Утилита find располагает множеством других параметров; полный перечень можно просмотреть на странице руководства (man find).
Помимо find, для поиска файлов в файловой системе можно использовать утилиту locate.
Использование locate (Using locate)¶
Утилита locate работает примерно так же, как find, однако имеет одно существенное преимущество. Дело в том, что каждый раз при выполнении поиска с помощью find утилита вручную обходит каждый каталог по указанному пути в поисках совпадений. Этот процесс может занять очень много времени, особенно при поиске сверху вниз от корня файловой системы.
Утилита locate, напротив, работает гораздо эффективнее. Вместо того чтобы каждый раз обходить файловую систему, она строит индекс файлов. Затем при запуске поиска locate просто обращается к этому индексу, не сканируя файловую систему напрямую. В результате в большинстве ситуаций locate работает значительно быстрее, чем find.
Для использования locate необходимо сначала установить в системе пакет findutils-locate. После установки пакета в каталоге /var/log будет создан индекс (с именем locatedb), содержащий сведения обо всех файлах файловой системы. Этот индекс обновляется ежедневно с учётом последних изменений в файловой системе. Тем не менее индекс можно обновить и вручную с помощью команды updatedb в приглашении командной строки. Имейте в виду, что updatedb выполняет всю подготовительную работу для утилиты locate: эта операция может занять некоторое время и потребовать значительных системных ресурсов.
После обновления индекса поиск файлов выполняется простым вводом в приглашении командной строки команды locate имя_файла. Например, для поиска файла с именем snmp.conf можно ввести locate snmp.conf, как показано ниже:
Обратите внимание: locate нашёл два файла, в имени которых присутствует строка snmp.conf.
Совет
Файл /etc/updatedb.conf используется для настройки поведения утилиты updatedb. Переменная PRUNEFS в этом файле позволяет указать типы файловых систем, которые updatedb не должна сканировать. Переменная PRUNEPATHS задаёт список каталогов в файловой системе, которые updatedb должна пропускать при сканировании.
Рассмотрим теперь, как использовать which.
Использование which (Using which)¶
Команда which отображает полный путь к команде или утилите командной оболочки. Например, чтобы узнать полный путь к команде ls, введите в приглашении командной строки which ls. На экране будет выведен полный путь к ls, как показано ниже:
Помимо which, можно также использовать whereis. Рассмотрим эту утилиту.
Использование whereis (Using whereis)¶
Команда whereis находит исходный код, исполняемые файлы и страницы руководства для указанных команд. Параметр -b возвращает расположение исполняемого файла указанной команды. Параметр -m возвращает расположение страниц руководства команды. Для просмотра расположения исходного кода используйте параметр -s. Если параметр не указан, возвращается вся имеющаяся информация.
Например, при вводе в приглашении командной строки whereis -b ls возвращается расположение исполняемого файла команды ls:
Аналогично, команда whereis -m ls возвращает расположение файла страницы руководства команды ls:
Использование type (Using type)¶
Команда type показывает, какой тип команды выполняется при её вводе. Возможны следующие варианты:
-
Встроенная команда оболочки — команда, жёстко встроенная в саму оболочку. Например, команда
cdявляется встроенной: -
Внешняя команда, вызываемая оболочкой — если команда недавно выполнялась в текущем сеансе оболочки, вывод
typeсообщает, что команда хеширована (hashed). Это означает, что расположение внешней команды в файловой системе сохранено в хеш-таблице оболочки. При повторном вызове той же команды оболочка выполнит её, не выполняя поиск по каталогам переменной окружения$PATH. Пример: -
Псевдоним (alias) — псевдоним представляет собой сокращённое обозначение другого файла в файловой системе Linux. Псевдонимы часто используются для часто применяемых команд, например
ls: -
Функция — оболочка
bashпозволяет создавать новые внутренние команды путём определения собственных функций оболочки.
Команду type можно также использовать с параметром -a. Этот параметр заставляет type вернуть все экземпляры указанной команды в файловой системе. Например, ввод команды type -a ip показывает, что в системе существуют два исполняемых файла с именем ip:
Попрактикуемся в использовании инструментов поиска Linux в следующем упражнении.
Упражнение 4-1. Использование инструментов поиска Linux
В этом упражнении вы попрактикуетесь в использовании инструментов поиска Linux. Упражнение можно выполнить на виртуальной машине, прилагаемой к книге. Для получения правильно настроенной среды запустите снимок состояния 4-1.
Совет
Посмотрите видеозапись упражнения 4-1 с демонстрацией выполнения этого задания.
Выполните следующее:
- Убедитесь, что вы вошли в систему Linux под учётной записью
studentс паролемstudent. - При необходимости откройте сеанс терминала.
- Переключитесь на учётную запись суперпользователя
root, введя в приглашении командной строкиsu -и указав парольstudent. - Выполните поиск файла
resolv.conf, введя в приглашении командной строкиfind / -name "resolv.conf". Где расположен этот файл? - Выполните тот же поиск с помощью
locate, введя в приглашении командной строкиlocate resolv.conf. - Найдите расположение исполняемого файла
init, введя в приглашении командной строкиwhich init. Где он находится? - Введите в приглашении командной строки
whereis init. Где расположен файл, содержащий разделы руководства для командыinit? - Выведите последние строки файла журнала сообщений, введя в приглашении командной строки
tail /var/log/messages. - Проверьте, хеширована ли теперь команда
tailсеансом оболочки, введяtype tail. Хеширована ли она? Что это означает?