7.5. Поиск файлов и бинарников в системе

[+]7.5.1. whatis(1)
[+]7.5.2. whereis(1), which(1)
[+]7.5.3. locate(1)
[+]7.5.4. find(1)
[+]7.5.5. sh type

Описание:  Кандидат BSDA должен уметь быстро найти где находится нужный файл и знать какие утилиты нужны для обнаружения бинарников, исходных кодов, страниц man и файлов. Кандидат должен уметь обновить базу данных locate(1)

Практика: whatis(1), whereis(1), which(1), locate(1), find(1), sh(1) включая встроенную команду type и опции -v и -V, locate.updatedb(8), locate.conf(5).

Комментарий

7.5.1. whatis(1)

Команда whatis(1) ищет краткое описание программы в некоторой индексированной базе данных. База данных создаётся командой makewhatis. Она разбита на файлы, хранящиеся там же, где и сами базы man: */man/whatis. Обычно это делается раз в неделю при помощи демона cron (в DragonFly BSD и FreeBSD при помощи задания из системы periodic, в OpenBSD при помощи /etc/weekly).

$ whatis grep
grep(1), egrep(1), fgrep(1), zgrep(1), zegrep(1), zfgrep(1), bzgrep(1), bzegrep(1),
bzfgrep(1) - print lines matching a pattern
        

7.5.2. whereis(1), which(1)

Команда whereis(1) в FreeBSD и DragonFly BSD ищет расположение бинарного файла, соответствующей ему страницы man и расположение каталога с исходным кодом для этой программы.

$ whereis grep
grep: /usr/bin/grep /usr/share/man/man1/grep.1.gz /usr/src/gnu/usr.bin/grep
        

В OpenBSD и NetBSD whereis(1) более лаконична и сообщает только о расположение исполнимого файла. Таким образом, в этих системах она не отличима от команды which(1).

7.5.3. locate(1)

Команда locate(1) позволяет искать файлы в индексированной базе данных. Поиск в такой базе осуществляется практически мгновенно, что выгодным образом отличает команду locate(1) от команды find(1). Однако база данных locate нуждается в постоянном обновлении. Иначе результат работы этой команды может оказаться неактуальным. Обычно обновление базы locate осуществляется через демон cron, как и обновление базы whatis. В DragonFly BSD и FreeBSD это задание присутствует в списке задач periodic(1) weekly, в OpenBSD и в NetBSD в скрипте /etc/weekly.

Обновление базы данных по всех системах BSD производится программой locate.updatedb(8) находящейся по адресу /usr/libexec/locate.updatedb. Конфигурационный файл этой программы в DragonFly BSD, FreeBSD и OpenBSD — /etc/locate.rc. В NetBSD — /etc/locate.conf.

Запуск команды locate.updatedb(8) в правами root не лучшая идея. В этом случае в базу данных locate(1) — /var/db/locate.database попадёт вся информация о файловой системе, и злоумышленник сможет получить информацию о составе каталогов, на которые у него нет прав чтения. Обычно команду locate.updatedb(8) запускают от пользователя nobody, если у вас есть сомнения, посмотрите как это сделано в скриптах вызываемых через cron. В FreeBSD можно выполнить команду /etc/periodic/weekly/310.locate.

7.5.4. find(1)

Команда find(1) тоже предназначена для поиска файлов, однако она, в отличие от locate, осуществляет реальный поиск в системе, а не заглядывает в базы данных. Работает она, поэтому, значительно медленнее, однако её возможности чрезвычайно велики. Подробнее она будет описана ниже (см. Раздел 7.6, «Поиск файла по заданным атрибутам»).

7.5.5. sh type

Не все команды вызываются при помощи сценариев или бинарников. Есть ещё встроенные команды оболочки, определённые функции. Так, например, по команде which alias мы увидим некоторый бинарный файл /usr/bin/alias. Но на самом деле, alias это встроенная команда, как в sh(1), так и в csh(1). Чтобы отличить встроенную команду от обычной существует команда type. Она же поможет нам определить не является ли используемая нами команда собственно alias'ом (псевдонимом).

$ type alias
alias is a shell builtin
$ type grep
grep is /usr/bin/grep
$ type ls
ls is aliased to `ls -GF'
        

В csh команды type нет.