Find, locate, whereis и grep
Команды find, locate, whereis и grep – мощные инструменты поиска файлов. Мы рассмотрим наиболее основные варианты их применения, поскольку полное описание потребовало бы целой главы. Полное описание каждой команды можно найти на соответствующих страницах руководства (команду обращения к ним рассмотрена далее).
Все эти команды предназначены для поиска, но назначение у каждой свое. Команда find применяется для поиска файлов по ряду критериев, в том числе по имени и дате создания, grep – для поиска в файлах определенного содержимого.
Find
Если вы купили свой первый компьютер раньше, чем эту книгу, то у вас, наверняка, возникала проблема поиска недавно созданного файла, позабытого в каком-то каталоге. Ответ Unix на эту проблему – команда find.
Эта команда позволяет отыскивать файлы по имени, дате создания или модификации, владельцу (обычно, это создатель файла), объему и даже типу файла. Мы рассмотрим лишь самый распространенный способ поиска – по имени файла.
Основная структура команды find следующая.
$ find starting-directory parameters actions
Параметр starting-directory определяет каталог, с которого должен начинаться поиск. Например, если в качестве этого параметра указать /home, поиск будет проводиться во всех подкаталогах каталога /home – в исходных каталогах пользователей. Если указать одну косую (/), будет выполнен поиск по всем каталогам.
Параметр parameters означает критерии поиска. В нашем случае, это имя файла, который надо найти (-name имя_ файла).
Параметр actions указывает, что делать с найденными файлами. Чаще всего указывается флажок -print, по которому выводится имя найденного файла с указанием пути. Задавать поиск без этого параметра бессмысленно, поскольку результат останется неизвестным.
Подытожим. Чтобы найти в системе все файлы с именем foo, введите следующую команду.
$ find / – name foo – print
На экране результат будет выглядеть примерно так:
$ find / – name foo – print /trap/foo /home/armand/foo /home/tdanesh/foo
Совет
Обратите внимание: в предыдущем примере задавался поиск во всей системе. Чтобы такая операция была возможна, необходимо войти в систему как корневой пользователь, которому доступны все каталоги. Если этого не сделать, то в ответ на каждую попытку провести поиск в каталоге, к которому нет доступа, будет выводиться сообщение об ошибке "permission denied" (нет доступа).
В команде поиска можно указать лишь часть имени. Например, если о файле, который необходимо найти, известно только то, что его имя начинается на "fо", то можно указать для поиска имя "fо*", где звездочка означает любое сочетание символов, разрешенных в имени файла.
$ find / – name 'fo*' – print /tmp/foo /var/lib/texmf/fonts /usr/bin/font2c /usr/bin/mh/folders /usr/bin/mh/folder /usr/bin/mh/forw /usr/bin/formail /usr/bin/fontexport /usr/bin/fontimport /usr/bin/fold
…и т.д.
Обратите внимание: имя файла указано в одинарных кавычках 'fо*'. Если не сделать этого при использовании подстановочного символа "*", то ответом на ввод команды будет сообщение об ошибке.
$ find / – name fo* – print – mount find: paths must precede expression Usage: find [path…] [expression]
Если результаты выполнения команды find не помещаются на экране, можно присоединить к ней команду more, как в примере с командой ls – |.
$ find / – name 'fo*' – print | more