Файловая система UNIX похожа на
континент со множеством городов
и, действительно, с адресами
внутри городов. Каталоги и
различные уровни подкаталогов
можно сравнить с маршрутами
между различными пунктами
назначения, названия файлов - с
адресами. Большое число путей и
мест назначения может выглядеть
пугающе, но благодаря
регулярности и логичности,
файловая система UNIX позволяет
вам легко перемещаться из одного
места в другое, если вы знаете
несколько основополагающих
принципов.
Будучи пользователями UNIX, все
мы научились пользоваться
основными командами файловой
информации, как, например, ls с
различными опциями. Мы знаем,
как перемещаться между
каталогами и копировать или
перемещать файлы. Тем не менее,
находить нужную информацию о
файлах из всей массы информации
не так-то легко. Нам необходимо
создать инструментальные
средства, которые используют
древовидную структуру файлов в
UNIX, чтобы находить то, что мы
ищем, и, соответственно,
выводить информацию о файлах на
экран, печатать листинги
содержимого файлов и т.д.
Эта глава знакомит с
инструментальными средствами,
которые облегчают задачу поиска
и доступа к файлам. Доступ к
файлам может быть обеспечен
различными способами, поэтому
техника и стиль меняются от
одного командного файла к
другому. Например, в некоторых
случаях вам нужно найти имена
всех файлов в данном сегменте
файлового дерева, в других
случаях вас будут интересовать
файлы только заданного типа:
текстовые файлы вообще или
исходные файлы на языке Си в
частности.
Комбинирование идей
Две концепции являются общими
почти для всех файловых
инструментальных средств. Первая
- это идея рекурсивного поиска,
которая означает, что некоторые
команды системы UNIX (например,
find) просматривают все файловое
дерево, начиная с некоторой
заданной начальной точки (или с
текущего каталога). Если в
данном каталоге встречается
подкаталог, то его содержимое
тоже исследуется - и так далее
вниз к самому нижнему
под-подкаталогу. Так проходятся
маршруты ко всем файлам в целом
дереве.
Стандартные команды системы UNIX
обеспечивают только ограниченное
число основных функций, которые
могут работать рекурсивно по
всему файловому дереву. Наша
стратегия при создании
инструментальных средств в этой
главе - воспользоваться
преимуществами такого
рекурсивного поиска и
распространить их на многие
другие функции.
Вторая ключевая идея, связанная
с полезными файловыми
инструментальными средствами -
это возможность соединения
команд с программными каналами и
управление потоком данных с
помощью переадресации. Вероятно,
вы уже встречались с подобными
особенностями в вашей
собственной работе с UNIX и
эффективно их использовали.
Возможно, вы еще не осознали,
что соединение рекурсивного
поиска, предоставляемого
некоторыми стандартными
командами, со специфическими
функциями, предоставляемыми
другими командами, позволяет нам
создать команды, которые
автоматически обходят обширные
файловые деревья и извлекают
нужную информацию. (В следующей
главе мы выйдем за пределы
распечатки и отображения
информации на экран и научимся
работать с файлами так, что мы
сможем копировать, перемещать и
восстанавливать их по мере
надобности.)
Для удобства мы сгруппируем
инструментальные средства в два
раздела: поиск файлов и
распечатка файловой информации.
Имеет смысл представлять их в
таком порядке, так как вы
сначала должны найти файл, чтобы
потом с ним работать.
Поиск файлов
Этот раздел посвящен поиску
файлов, где бы они ни
находились, выводу на экран
выбранной информации и поиску
символьных строк внутри файлов.
Первая программа, tree, обходит
все файловое дерево и печатает
имена всех файлов в формате
визуального дерева. Она
рекурсивно спускается в каждый
каталог и находит все его файлы,
обеспечивая тем самым глобальный
осмотр файловых областей и их
вложенной по глубине структуры.
Другое инструментальное средство
- это thead. Thead печатает
несколько первых строк текстовых
файлов, которые находятся в
данном сегменте файлового
дерева. Просматривая заголовок,
т.е. первые несколько строк
файла, вы можете получить
достаточно информации, чтобы
идентифицировать содержимое
файла. При вызове thead вы
можете явно задать каталог либо
передать команде thead по
конвейеру список полных имен
файлов. Это делает команду thead
фильтром - особым видом команд
системы UNIX, который мы обсудим
позже.
Следующее инструментальное
средство - tgrep. Как следует из
названия, это еще одна команда,
связанная с файловым деревом,
которая использует утилиту grep.
Tgrep ищет символьные строки в
каждом файле, который находится
в данном сегменте файлового
дерева. Tgrep также является
фильтром, так что имена файлов
можно передавать ей по
конвейеру.
В нашем последнем проекте в этом
разделе мы обратимся к
использованию каталогов как
средства "навигации". Сначала мы
опишем основной алгоритм для
утилиты, которая для каждого
файла из заданного списка файлов
проверяет, находится ли этот
файл в каком-либо каталоге по
указанному маршруту поиска.
Затем мы построим paths -
утилиту, которая дополняет
функцию поиска полезными
опциями.
Распечатка файла
Этот раздел знакомит вас с
инструментальными средствами,
предназначенными для вывода на
экран имен файлов и их
содержимого. Инструменты такого
рода весьма полезны, так как они
могут значительно уменьшить
количество необходимых символов,
набираемых с клавиатуры при
запуске команды, и внести больше
смысла в одну команду.
Первые два командных файла
являются пре- и постпроцессорами
для команды ls. Команда lc
выводит файловую информацию по
столбцам, команда ll перечисляет
файлы в длинном формате. Эти
командные файлы дополнены
опциями команды ls, чтобы
сделать распечатки более
информативными. Так как команда
ls используется довольно часто,
упаковка наиболее часто
применяемых нажатий клавиш в
командные файлы представляется
целесообразной. Упаковка
уменьшает количество постоянно
набираемых символов и упрощает
использование команд, исключает
необходимость запоминания
подробного синтаксиса.
Третье инструментальное средство
- это kind. Kind - еще один
командный файл препроцессорного
типа, использующий команду UNIX
file. Команда file читает
указанный файл и затем сообщает,
является ли этот файл текстовым,
архивным или исполняемым.
Поскольку распечатки команды
file не выбирают файлы заданного
типа, возникает необходимость в
создании для этого специальной
утилиты. Команда kind работает с
распечаткой команды file. Kind
выводит на экран имена файлов
только заданного типа.
Еще один командный файл - m,
который облегчает работу со
стандартной командой more
системы UNIX, уменьшая
количество необходимых для
запуска команды символов и
упрощая интерфейс. Делается это
без потери гибкости: так же, как
вы можете использовать команду
more для файла или передать
команде more данные по
программному каналу, вы можете
сделать то же самое для m.
Следующий командный файл - это
mmm. Он состоит из одной
заготовленной командной строки
для программы nroff системы UNIX.
Существует много способов вызова
команды nroff и множество
различных опций к ней. Если же
вы редко используете nroff, у
вас могут возникнуть трудности в
запоминании специфических опций,
необходимых для вашей работы с
командой. Эти проблемы отпадут,
если у вас есть команда mmm.
Определите опции, которые вы
обычно используете, и введите их
в командный файл mmm (о том, как
это сделать практически, речь
пойдет ниже). Теперь достаточно
набрать mmm - и вы имеете
возможность работать с вашей
командой nroff.
Последняя утилита - pall. Pall
обходит файловое дерево, ведя
поиск файлов заданного типа, и
готовит их к выводу на принтер.
Команда pr системы UNIX
используется для разбивки на
страницы всех файлов вместе и
включения заголовков. Эта
команда предлагает на
рассмотрение принтеру один
большой файл и наиболее полезна
в тех случаях, когда у вас
имеется множество каталогов с
текстовыми файлами или с
исходными файлами программ.
Определив в общем основные наши
задачи, перейдем к более
близкому знакомству с
упомянутыми инструментальными
средствами.
Поиск файлов
tree
- визуализация файлового дерева
Имя: TREE
tree
- вывод на экран структуры
файлового дерева
Название
Находит все файлы в файловом
дереве и выводит на экран имена
файлов, показывая иерархическую
структуру файлового дерева.
Форма
вызова
tree [dir]
Пример
вызова
$ tree $HOME
Выводит структуру файлового
дерева регистрационного
каталога.
Текст программы
1 :
2 # @(#) tree v1.0 Visual
display of a file tree Author:
Russ Sage
2а вывод на
экран структуры файлового дерева
4 if [ "$#" -gt 1 ]
5 then echo "tree: wrong
arg count">&2
6 echo "usage: tree
[dir]" >&2
7 exit 2
8 fi
9 if [ "$#" -eq 1 ]
10 then if [ ! -d $1 ]
11 then echo "$0: $1 not a
directory">&2
12 echo "usage: tree
[dir]" >&2
13 exit 2
14 fi
15 fi
17 find ${1:-.} -print | sort
| sed -e "1p" -e "1d" \
18
-e "s|[^/]*/| /|g" \
19
-e "s|[^ */|/|" \
20
-e "s|/\([^/]*\)$|\1|" |