Главная » Программирование для UNIX » Каталоги и имена файлов UNIX

0

Все принадлежащие пользователю файлы имеют имена, начинающиеся с /usr/you, но если ваш единственный файл называется junk, то, выполнив команду ls, вы не увидите имени /usr/you/junk; имя файла напечатается без префикса:

$ ls

junk

$

Это происходит потому, что  каждая  выполняющаяся программа, то есть каждый процесс, имеет  текущий каталог и подразумевается, что все имена файлов начинаются с имени этого  каталога, если только в начале имени не задан явно  символ косой  черты /. Следовательно, и у оболочки, в которую пользователь попадает при  входе  в систему, и у команды ls есть  текущий каталог.  Команда pwd (print working directory – печатать текущий каталог) выводит имя текущего каталога:

$ pwd

/usr/you

$

Текущий каталог является атрибутом процесса, а не пользователя или  программы – у пользователей есть регистрационные каталоги, а у процессов – текущие. Если процесс порождает другой процесс, то потомок наследует текущий каталог своего родителя. Но если дочерний процесс переходит в другой каталог, на родителе это никак не отражается – его текущий каталог останется прежним, что бы ни делали его потомки.

Понятие текущего каталога введено во многом для  удобства обозначения, ведь оно позволяет значительно сократить объем  вводимого текс-

та, но его основное назначение – организационное. Родственные фай лы размещаются в одном каталоге. Обычно каталог /usr служит вершиной пользовательской файловой системы. (Слово user сокращено до usr в духе cmp, ls и т. п.) Каталог /usr/you представляет собой регистрационный, то есть текущий каталог при  первом1 входе  в систему. В /usr/src находятся исходные тексты системных программ, в /usr/src/cmd – исходные тексты команд UNIX, в /usr/src/cmd/sh – тексты оболочки и т. д. Начиная новый проект или  просто  размещая группу файлов, например  кулинарных  рецептов, можно создать  новый каталог  командой mkdir и разместить там файлы.

$ pwd

/usr/you

$ mkdir  recipes

$ cd recipes

$ pwd

/usr/you/recipes

$ mkdir  pie  cookie

$ ed pie/apple

$ ed cookie/choc.chip

$

Обратите внимание на то, как просто выполняется ссылка на подкаталог.  Смысл pie/apple очевиден: рецепт яблочного пирога, расположенный  в каталоге, /usr/you/recipes/pie.2  Можно было  бы поместить этот рецепт не  в  подкаталог каталога  рецептов,  а,  скажем, в  recipes/ap– ple.pie,  но логичнее все-таки хранить все рецепты пирогов в отдельном  месте. Например, рецепт  приготовления глазури можно помес тить  в recipes/pie/crust вместо  того, чтобы дублировать его в рецепте каждого пирога.

Файловая система представляет собой мощное средство организации,  но пользователь может забыть и то, куда  он положил файл, и то, какие вообще файлы у него есть.  Решить эту проблему поможет пара  команд, просматривающих  каталоги. Команда ls весьма полезна при  поиске файлов, но она не просматривает подкаталоги.3

$ cd

$ ls

1                    На самом  деле и при всех последующих входах тоже; почему автор  написал

«при первом», непонятно, речь  идет  явно  о текущем каталоге сразу после  регистрации на машине. – Примеч. науч. ред.

2                    В переводе с английского recipes – рецепты, cookie – печенье, pie – пирог, apple – яблоко, crust – глазурь. – Примеч. перев.

3                    Большинство современных реализаций  UNIX  допускают использование команды с параметром ls –R для рекурсивного просмотра подкаталогов. – Примеч. науч. ред.

junk recipes

$ file *

junk:      ascii  text recipes:               directory

$ ls recipes

cookie pie

$ ls recipes/pie

apple crust

$

Эту часть  файловой системы можно представить графически (рис.  2.1).

Рис. 2.1. Графическое представление файловой системы

Команда du (disc usage – использование диска) предназначена для определения  дискового   пространства,  занимаемого  файлами   каталога, включая все подкаталоги.

$ du

6             ./recipes/pie

4             ./recipes/cookie

11           ./recipes

13           .

$

В столбце слева  указано количество дисковых блоков (обычно  размером 512 или 1024  байт каждый), занимаемых каждым из файлов. Значение в строке каталога показывает количество блоков, занятых всеми файлами каталога и его подкаталогами, включая и сам файл каталога.

Команда du имеет  параметр –a (all – все),  при задании которого выво дятся все файлы каталога. Если  среди  файлов есть каталоги, то du обработает и их:

$ du -a

2                                                    ./recipes/pie/apple

3                                                    ./recipes/pie/crust

6             ./recipes/pie

3              ./recipes/cookie/choc.chip

4              ./recipes/cookie

11           ./recipes

1             ./junk

13           .

$

Вывод  команды du –a можно перенаправить на  grep,  если  требуется найти определенный файл:

$ du -a  | grep  choc

3             ./recipes/cookie/choc.chip

$

В главе 1 уже  рассказывалось о том,  что имя  «.» относится к элементу каталога, ссылающемуся на сам каталог, что позволяет обращаться к каталогу, не зная его полного имени.

Команда du просматривает каталог в поисках файлов; если  имя каталога  не указано, то подразумевается «.», то есть текущий каталог. Таким  образом, junk и ./junk – это имена одного и того же файла.

Каталоги, несмотря на свои особые свойства с точки зрения ядра, располагаются в файловой системе, как обычные файлы. Они могут  быть прочитаны, как и все файлы. Но в отличие от остальных, файлы каталогов не могут быть созданы или изменены обычными средствами; для  сохранения целостности файловой системы  ядро  оставляет за  собой контроль над содержимым этих  файлов.

Настало время взглянуть на байты внутри каталога:

$ od -cb  .

0000000    4     ;   .  \0    \0    \0    \0    \0    \0    \0    \0    \0    \0    \0    \0    \0

064 073 056 000 000 000 000 000 000 000 000  000 000 000 000 000

0000020 273     (   .   .  \0    \0    \0    \0    \0    \0    \0    \0   \0    \0    \0    \0

273 050 056 056 000 000 000 000 000 000 000  000 000 000 000 000

0000040 252     ;   r   e     c     i   p     e     s    \0    \0    \0    \0    \0    \0    \0

252 073 162 145 143 151 160 145 163 000 000  000 000 000 000 000

0000060 230     =     j   u     n     k   \0    \0    \0    \0    \0    \0    \0    \0    \0    \0

230 075 152 165 156 153 000 000 000 000 000  000 000 000 000 000

0000100

$

Видите имена файлов, «зашитые» внутри? Формат каталога совмещает двоичные и текстовые данные. Данные расположены порциями по 16  байт, последние 14  из  которых содержат имя  файла, дополненное ASCII-символами NUL (со значением 0), а первые два сообщают систе ме, где находится служебная информация о данном файле (вернемся к

этому  позже).1  Каждый каталог начинается с пары записей: «.» (точка) и «..» (точка-точка).

$ cd                              Домашний каталог

$ cd recipes

$ pwd

/usr/you/recipes

$ cd ..; pwd                 На один уровень вверх

/usr/you

$ cd ..; pwd                 Еще на уровень вверх

/usr

$ cd ..; pwd                 Еще на уровень вверх

/

$ cd ..; pwd                 Еще на уровень вверх

/                     Выше идти некуда

$

Каталог / называется корневым каталогом системы. Все файлы в системе  находятся либо  в корневом каталоге, либо  в его  подкаталогах, при этом корневой каталог является родительским сам для себя.

Упражнение 2.2. На основании информации этого раздела можно в общих чертах представить себе механизм работы команды ls. Подсказка:  cat  . >foo;  ls –f  foo. ~

Упражнение 2.3. (более сложное). Как работает команда pwd? ~

Упражнение 2.4.  Команда du была  создана для слежения за использованием диска. Ее применение для  поиска файлов в каталоге представляется  довольно странным и,  возможно, неправильным. В качестве альтернативы изучите страницу руководства  find(1) и  сравните эти две команды.  В частности, сравните команду du –a  | grep   … с соответствующим вызовом find. Какая из них работает быстрее? Что  луч ше  – написать новую программу или  использовать побочный эффект существующей? ~

Источник: Керниган Б., Пайк Р., UNIX. Программное окружение. – Пер. с англ. – СПб: Символ-Плюс, 2003. – 416 с., ил.

По теме:

  • Комментарии