Поиск информации в файловой системе можно условно разделить на поиск по атрибутам файла (понимая их расширительно, то есть включая имя, путь и т. п.) и поиск по содержимому. Для этих видов поиска как правило используются программы find и grep соответственно. Благодаря удобным средствам межпроцессного взаимодействия, эти два вида поиска легко объединить, то есть искать нужную информацию только в файлах с нужными атрибутами[1].
Основным средством поиcка по атрибутам файла является программа
find. Обобщенный вызов
find выглядит так: find
путь
выражение
, где
путь
— это список каталогов, в
которых надо искать, а выражение
— набор выражений, описывающих критерии отбора файлов и
действия, которые надо произвести над найденными файлами. По
умолчанию имена найденных файлов просто выводятся на стандартный
вывод, но это можно переопределить и передавать список имён
найденных файлов любой команде для обработки. По умолчанию
find ищет во всех подкаталогах каталогов,
заданных в списке путей.
Выражения, определяющие критерии поиска файлов, состоят из пар ключ — значение. Ниже перечислены некоторые из возможных параметров поиска:
Время последнего доступа к файлу. Позволяет искать файлы, которые были открыты в некоторый период времени, или наоброт, файлы, к которым никто не обращался в течение некоторого периода.
Время последнего изменения статуса файла.
Тип файловой системы, на которой расположен файл.
Пользователь и группа, которым принадлежит файл.
Соответствие имени файла заданному шаблону.
Соответствие имени файла регулярному выражению.
Соответствие полного имени файла (с путём) заданному шаблону.
Права доступа.
Размер файла.
Тип файла.
Программа find может выполнять различные действия над найденными файлами. Наиболее важные из них:
Вывести имя файла на стандартный выход (действие по умолчанию);
удалить файл;
выполнить команду, передав ей в качестве параметра имя файла.
Об остальных можно прочитать в экранной документации по команде find, отдав команду man find.
Параметры влияют на общее поведение find. Наиболее важные из них:
максимальная глубина поиска в подкаталогах;
минимальная глубина поиска в подкаталогах;
поиск только в пределах одной файловой системы.
Об остальных можно прочитать в экранной документации по команде find.
Пример 1. Перекодировка имён файлов и каталогов из koi8-r в cp1251
find ./ -print | tac | sed -e 's/"/\\"/' | while read name; do mv "$name" "`dirname "$name"`/`basename "$name" | iconv -f koi8-r -t cp1251`"; done
[1] Необходимость искать файлы с нужными атрибутами среди файлов с нужным содержимым возникает реже, так как поиск по атрибутам в общем случае работает намного быстрее.