В некоторых дистрибутивах при попытке запустить locate сразу после установки она потерпит неудачу, но если попытаться использовать ее на следующий день, все, как ни странно будет работать как надо. Так в чем же проблема? База данных для locate создается другой программой с именем updatedb. Обычно она периодически запускается как
find — сложный способ поиска файлов
В отличие от программы locate, выполняющей поиск файлов по именам, программа find ищет файлы согласно заданным атрибутам в указанном каталоге (и во вложенных подкаталогах). Далее мы потратим время на исследование команды find, потому что она имеет множество интересных особенностей, с которыми мы неоднократно столкнемся, когда начнем знакомиться с приемами программирования в последующих главах.
В простейшем случае программе find можно передать одно или несколько имен каталогов для поиска. Например, с ее помощью можно получить список содержимого домашнего каталога:
[me@linuxbox ~]$ find ~
Для большинства активных пользователей она выдаст длинный список. Так как список выводится в стандартный вывод, его можно передать по конвейеру другим программам. Воспользуемся программой wc, чтобы подсчитать число файлов:
[me@linuxbox ~]$ find ~ | wc -l
47068
Ух ты, вот это мы поработали! Вся прелесть команды find в том, что ее можно использовать для поиска файлов, соответствующих определенным критериям. Она делает это посредством (что немного странно) применения
Проверки
Допустим, мы хотим получить список каталогов. Для этого добавим в команду следующую проверку:
[me@linuxbox ~]$ find ~ -type d | wc -l
1695
Добавив проверку -type d, мы ограничились поиском только каталогов. Но точно так же можно ограничить поиск только обычными файлами:
[me@linuxbox ~]$ find ~ -type f | wc -l
38737
В табл. 17.1 перечислены проверки типов файлов, наиболее часто используемых с командой find.
Таблица 17.1. Проверки типов файлов в find
Тип файлов
Описание
b
Специальный файл блочного устройства
c
Специальный файл символьного устройства
d
Каталог
f
Обычный файл
l
Символическая ссылка
Добавив дополнительные проверки, можно выполнять поиск файлов по размеру и имени. Давайте найдем все обычные файлы с именами, соответствующими шаблону
[me@linuxbox ~]$ find ~ -type f -name "*.JPG" -size +1M | wc -l
840
В этом примере мы добавили проверку -name с шаблоном имени файла. Обратите внимание, что шаблон заключен в кавычки, чтобы предотвратить подстановку имен файлов командной оболочкой. Далее мы добавили проверку -size со строкой +1M. Начальный символ «плюс» указывает, что требуется искать файлы, размер которых превышает указанное число. Начальный символ «минус» изменил бы значение строки на противоположное: «меньше указанного числа». Число без знака означает: «в точности соответствует значению». Буква M в конце определяет единицы измерения – мегабайты (Megabytes). В табл. 17.2 перечислены символы, которые можно использовать для обозначения единиц измерения.
Команда find поддерживает множество разнообразных проверок. В табл. 17.3 приводится краткое описание наиболее часто используемых из них. Обратите внимание, что в случаях, когда требуется числовой аргумент, допустимо использование формы записи с символами + и -, обсуждавшейся выше.
Таблица 17.2. Единицы измерения, поддерживаемые командой find
Символ
Единица измерения
b
Блоки размером по 512 байт (используется по умолчанию, если иное не указано явно)
c
Байты
w
2-байтные слова
k
Килобайты (Kilobytes, блоки по 1024 байт)
M
Мегабайты (Megabytes, блоки по 1 048 576 байт)
G
Гигабайты (Gigabytes, блоки по 1 073 741 824 байт)
Таблица 17.3. Проверки, поддерживаемые командой find
Проверка
Описание
-cmin n
Соответствует файлам или каталогам, содержимое или атрибуты которых последний раз изменялись точно n минут назад. Чтобы выразить условие «менее n минут назад», используйте -n; чтобы выразить условие «более n минут назад», используйте +n
-cnewer имя
Соответствует файлам или каталогам, содержимое или атрибуты которых последний раз изменялись позже, чем у файла с указанным именем
-ctime n
Соответствует файлам или каталогам, содержимое или атрибуты (то есть разрешения) которых последний раз изменялись более чем n*24 часа назад